这可能非常简单,但是....我有一个非常复杂的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的情况下重写查询?
答案 0 :(得分:2)
问题是你不能只是在你的Linq查询中注入一个函数,因为Linq-to-SQL或Linq-to-Entities不知道如何翻译它。 LINQPad网站上有一个good description of the problem, and a solution。
另一种方法是首先将数据集放入内存(例如,使用ToList()
),但这并不能真正实现您所追求的目标。