代码之家  ›  专栏  ›  技术社区  ›  Niels Bosma

Linq2Sql:在select中使用IQueryable

  •  0
  • Niels Bosma  · 技术社区  · 14 年前

    这很可能是微不足道的,但是。。。。我有一个相当复杂的linq查询,我把它放在一个IQueryable函数中,我想在整个项目中重用它。但当我在一个选择中使用这个时,我得到了“系统Linq IQueryable`1[LINQPad.User.Orders命令]福(系统.Guid)没有到SQL的翻译“:”(非常简化,以显示我所追求的)

    void Main()
    {
     (from e in Clients
     select new {
      e.CompanyName,
      Orders = Foo(e.Id).Count()
     }).Take(20).Dump();
    }
    
    IQueryable<Orders> Foo(Guid clientId)
    {
     return Orders.Where(e => e.ClientId.Equals(clientId)); 
    }
    

    不起作用,但以下功能起作用:

    void Main()
    {
     (from e in Clients
     select new {
      e.CompanyName,
      Orders = Orders.Where(f => f.ClientId.Equals(e.Id)).Count()
     }).Take(20).Dump();
    }
    

    有没有什么方法可以重写查询而不重写Foo?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Bennor McCarthy    14 年前

    问题是不能只将函数注入到Linq查询中,因为linqtosql或linqtoentities不知道如何转换它。有一个 good description of the problem, and a solution 可在LINQPad网站获取。

    另一种方法是先将数据集放入内存(例如,使用 ToList()