我试图将linq分解为sql查询以使它们更具可读性。
假设我想要退回上一年有超过100个订单的产品的所有订单。我有这个问题:
from o in _context.Orders
where (from o1 in _context.Orders
where o1.Year == o.Year - 1 && o1.Product == o.Product
select o1).Count() > 100
select o;
我希望能够将嵌套查询放在可重用的函数中:
private IQueryable<Order> LastSeasonOrders(Order order)
{
return (from o in _context.Orders
where o.Year == order.Year - 1 && o.Product == order.Product
select o);
}
然后让我将原始查询更改为:
from o in _context.Orders
where LastSeasonOrders(o).Count() > 100
select o;
但这不起作用,但有一个例外,即在运行查询时无法将方法调用转换为SQL。
有关正确实现此目标的快速提示吗?
答案 0 :(得分:2)
如何 -
void Main()
{
TypedDataContext _context = ...
var query =
(
from o in _context.Orders
where LastSeasonOrders(_context , o).Count() > 100
select o
);
...
}
public static Func<TypedDataContext, Order, IQueryable<Order>>
LastSeasonOrders = CompiledQuery.Compile
(( TypedDataContext _context, Order order) =>
from o in _context.Orders
where o.Year == order.Year - 1 && o.Product == order.Product
select o
);
最好验证生成的sql与原始查询生成的sql相同。
答案 1 :(得分:0)
我只是从臀部开始射击,但您是否尝试将LastSeasonOrders
的返回类型更改为IQueryable<Order>
?