我正在使用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)。但我似乎无法让编译器接受这个。 我在这里错了吗?
答案 0 :(得分:2)
您不应将查询结果作为IDbSet<T>
返回。
来自MSDN 的
IDbSet
表示上下文中的所有实体的集合,或者可以从数据库中查询给定类型的集合。DbSet
是IDbSet
的具体实现。
您尝试只获取实体的子集。这就是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的样子:只从一个列中获取数据。