IDbSet 与 IEnumerable Linq 在需要强制转换的地方



我正在使用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表示上下文中给定类型的所有实体的集合,或者可以从数据库中查询的实体的集合。 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 的外观:仅从一列获取数据将从数据库中获取。

最新更新