Создание многоразовых фрагментов LINQ to SQL - PullRequest
5 голосов
/ 12 января 2011

Я пытаюсь разбить запросы 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 ]

2 голосов
/ 12 января 2011

Как насчет чего-то вроде -

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 такой же, как и ваш исходный запрос.

0 голосов
/ 12 января 2011

Я только стреляю с бедра, но вы пытались изменить тип возврата LastSeasonOrders на IQueryable<Order>?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...