代码之家  ›  专栏  ›  技术社区  ›  ItsPronounced Finn

我在理解IQueryable时遇到问题<T>

  •  14
  • ItsPronounced Finn  · 技术社区  · 15 年前

    所以我试着去理解 IQueryable<T> IQueryable<T>

    这是我的密码:

    public IQueryable<Items> GetItems()
        {
            return from item in db.Items
                   where item.IsActive == true
                   orderby item.ItemNumber
                   select item;
        }
    
    2 回复  |  直到 14 年前
        1
  •  15
  •   Marcelo Cantos    15 年前

    IQueryable将查询表示为表达式树,而不在服务器上对其求值。这允许您在实际生成SQL之前指定进一步的处理。

    在上述情况下,这意味着您可以对调用GetItems()的结果进行处理,并将原始查询和额外的内容作为单个查询发送:

    var recentItems = from item in GetItems()
                      where item.Timestamp > somedate
                      select item;
    
    foreach (var item in recentItems)
    {
        // Do something with an active recent item.
    }
    

    GetItems() 和后面指定的位,并发出一条SQL语句,该语句选择所有活动的和最近的项。

    为了澄清一个技术问题 IQueryable<T> 是一个 IEnumerable<T> ,当您尝试调用 GetEnumerator() foreach 声明。另外,扩展方法 ToArray() 将在内部执行这些操作之一,从而产生相同的效果。

        2
  •  5
  •   Steven    15 年前

    要使用LINQ2SQL示例。。。想象一下,你返回了一个IQueryable的客户。 在引擎盖下,它将不是一个客户机列表(直到您列出()它),而是一个SQL查询,如下所示:

    SELECT * FROM [Clients]
    

    现在这很方便,因为我们还没有找到数据库!因此,假设IQueriable返回时,我们希望将其细化为名为“Bob”的客户,我们可以:

    var clients = GetClients().Where(c => c.Name == "Bob");
    

    SELECT * FROM [Clients] WHERE Name = 'Bob'.
    

    现在,当我执行clients.ToList()时,查询将运行,数据库将被命中,并且我有一个名为bob的客户机列表,无需选择所有客户机,然后在内存中遍历它们,或者执行两次单独的数据库命中。

    例如,当datacontext退出作用域时(例如:在using语句中运行select),就要尝试访问子元素。在LINQ2SQL中,这就是加载选项派上用场的地方。

    希望有帮助

    推荐文章