Добавить лямбда-выражение для столбца в Linq .Where () - PullRequest
0 голосов
/ 10 марта 2011

У меня есть две таблицы: Заказы и Клиенты, причем Заказы ссылаются на Клиентов и их сопоставленные классы Заказ и Клиент.

Я хочу написать метод, который получает условие Linq Where () для Заказов и Клиентов.:

void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
        Expression<Func<Customer, bool>> customerCondition)
{
    var q = Database.Query<Order>().Where(orderCondition);
    q = q.Where(o => o.Customer APPLY customerCondition); // how ?

    ... process records in q ...
}

Даже после прочтения большого количества ответов SO по этой теме и связанных с ними статей в MSDN кажется, что я не могу понять, как применить условие клиента к свойству Order.Customer.

(БД / ORM используется Oracle / DevExpress, но я в порядке с универсальным решением, поэтому я не включил их в теги. Пожалуйста, укажите, ограничен ли ваш ответ конкретной БД или ORM)

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Вы можете попробовать что-то вроде этого:

var q = (from o in Database.Query<Order>().Where(orderCondition)
         join c in Database.Query<Customer>().Where(customerCondition) on o.CustomerID equals c.CustomerID
         select new { Order = o, Customer = c });
0 голосов
/ 10 марта 2011

Это один из способов достижения этого.

void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
        Expression<Func<Customer, bool>> customerCondition>>)
{
    var orders = Database.Query<Order>().Where(orderCondition);
    var customers = Database.Query<Customer>().Where(customerCondition);

    var q = from o in orders join c in customers on o.CustomerId == c.Id
            select new {o, c}
}

Опять же, в зависимости от ORM, что-то вроде этого может также работать (я предполагаю, что свойство коллекции Customer.Orders загружается лениво):

void ProcessOrders(Expression<Func<Order, bool>> orderCondition, 
        Expression<Func<Customer, bool>> customerCondition>>)
{
    var customers = Database.Query<Customer>().Where(customerCondition);

    var q = from c in customers
            let orders = c.Orders.Where(orderCondition)
            select new {c, orders}

}

Любое решение должно быть проверено на конкретном поставщике linq, поскольку разные поставщики linq могут поддерживать или не поддерживать определенные запросы ...

...