创建可重用的LINQ to SQL块

时间:2011-01-12 03:48:00

标签: linq linq-to-sql

我试图将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。

有关正确实现此目标的快速提示吗?

2 个答案:

答案 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>