Linq2Sql:在select中使用IQueryable

时间:2010-09-16 09:09:31

标签: c# linq-to-sql

这可能非常简单,但是....我有一个非常复杂的linq查询,我已经放入了一个我想在整个项目中重用的IQueryable函数。但是当我在select中使用它时,我得到“System.Linq.IQueryable`1 [LINQPad.User.Orders] Foo(System.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 个答案:

答案 0 :(得分:2)

问题是你不能只是在你的Linq查询中注入一个函数,因为Linq-to-SQL或Linq-to-Entities不知道如何翻译它。 LINQPad网站上有一个good description of the problem, and a solution

另一种方法是首先将数据集放入内存(例如,使用ToList()),但这并不能真正实现您所追求的目标。