使用IEnumerable Linq的IDbSet需要进行转换?

时间:2014-02-21 22:33:08

标签: c# linq entity-framework

我正在使用IDbSet作为结果集并尝试使用LinQ构造“IN”类型子句。 我的代码如下:

public IDbSet<User> Users { get; set; }

public IDbSet<User> GetUsers(params int[] IDs)
{
    return from u in Users
           where IDs.Contains(u.Id)
           select u;
}

编者不喜欢它所说的地方:
    无法将类型'System.Linq.IQueryable'隐式转换为'System.Data.Entity.IDbSet'。存在显式转换(您是否错过了演员?)

我尝试了常用的铸造和As(ing)。但我似乎无法让编译器接受这个。 我在这里错了吗?

1 个答案:

答案 0 :(得分:2)

您不应将查询结果作为IDbSet<T>返回。

  

IDbSet表示上下文中的所有实体的集合,或者可以从数据库中查询给定类型的集合。 DbSetIDbSet的具体实现。

     来自MSDN

您尝试只获取实体的子集。这就是IQueryable<T> / IEnuemerable<T>的用途。更改方法声明以返回IQueryable<User>

public IQueryable<User> GetUsers(params int[] IDs)
{
    return from u in Users
           where IDs.Contains(u.Id)
           select u;
}

IQueryable<T>IEnuemerable<T>之间的区别在于,当您返回IEnumerable<T>时,该实例上的每个LINQ查询集都将作为LINQ to Object执行,因此您将不会使用SQL受到影响:

var items = GetUsers().Select(x => x.SomeColumnName);

这个仍然会将Users表中的所有列放入内存并将它们作为LINQ to Objects查询进行投影。

使用返回IQueryable<T>的方法,相同的代码会影响生成的SQL的样子:只从一个列中获取数据。