我正在使用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)。 但我似乎无法让编译器接受这一点。我在这里有错吗?
将查询结果作为IDbSet<T>
返回。
IDbSet
表示上下文中给定类型的所有实体的集合,或者可以从数据库中查询的实体的集合。DbSet
是IDbSet
的具体实现。来自 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 的外观:仅从一列获取数据将从数据库中获取。