【问题标题】:IDbSet with IEnumerable Linq where casting required?IDbSet 与 IEnumerable Linq 在哪里需要转换?
【发布时间】:2017-10-02 20:23:49
【问题描述】:

我将 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)。但我似乎无法让编译器接受这一点。 我是不是搞错了?

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    您不应将查询结果返回为IDbSet&lt;T&gt;

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

    来自MSDN

    您正在尝试仅获取实体的子集。这就是IQueryable&lt;T&gt;/IEnuemerable&lt;T&gt; 的用途。更改方法声明以返回IQueryable&lt;User&gt;

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

    IQueryable&lt;T&gt;IEnuemerable&lt;T&gt; 之间的区别在于,当您返回 IEnumerable&lt;T&gt; 时,该实例上设置的每个下一个 LINQ 查询都将作为 LINQ to Object 执行,因此您的 SQL 不会受到影响:

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

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

    对于返回IQueryable&lt;T&gt; 的方法,相同的代码会影响生成的SQL 的外观:只会从DB 中获取一列的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多