Передача запроса выбора со ссылкой на две соединенные записи в Linq Query - PullRequest
0 голосов
/ 02 мая 2018

Предположим, у меня есть таблица с именем CustomerTransaction, и я могу передать критерии выбора в подпрограмму, например

void GetData1(Expression<Func<CustomerTransaction, bool>> selection)
{
    CustomerTransaction.Where(selection).Take(2).Dump();
}

используя код типа

Expression<Func<CustomerTransaction, bool>> query = r => (r.CustomerID == 1);
GetData1(query);

Однако я хотел бы иметь возможность объединить две записи из этой таблицы и передать критерии выбора, относящиеся к обеим таблицам.

Например, будет скомпилировано следующее (в LinqPad),

void GetData2(Expression<Func<Tuple<CustomerTransaction,CustomerTransaction>, bool>> selection)
{
   var baseQuery = (from ct1 in CustomerTransaction 
        join ct2 in CustomerTransaction on ct1.MasterTransactionID equals ct2.RelatedTransactionID 
        select new Tuple<CustomerTransaction, CustomerTransaction> ( ct1, ct2)) ;

    var query = baseQuery.Where(selection).Dump();
}

Expression<Func<Tuple<CustomerTransaction,CustomerTransaction>, bool>> query2 =
       r => r.Item1.CustomerID != r.Item2.CustomerID;

GetData2(query2);

Однако он не будет работать, поскольку SQL не обрабатывает кортеж.

Если я попытаюсь написать это каким-то образом, который будет понятен SQL, тогда я не смогу пройти критерии отбора, потому что не знаю тип выбора

, например

void GetData3( ???  selection)
{
    var baseQuery = (from ct1 in CustomerTransaction
     join ct2 in CustomerTransaction on ct1.MasterTransactionID equals ct2.RelatedTransactionID
     select new { Customer1 = ct1.CustomerID, Customer2 = ct2.CustomerID }  );

    baseQuery.Where(selection).Dump();
}

Очевидно, что реальный запрос является более сложным, и они являются множественными критериями выбора, и я стараюсь не дублировать запрос для каждого возможного критерия раздела.

Есть ли способ обойти это?

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете создать явный класс, который представляет ваш join результат, и создать выражение Where для этого класса:

public class CT2 {
    public CustomerTransaction ct1;
    public CustomerTransaction ct2;
}

Тогда вы можете использовать класс в вашем запросе и Where выражение:

void GetData2(Expression<Func<CT2, bool>> selection) {
    var baseQuery = from ct1 in db.CustomerTransaction
                    join ct2 in db.CustomerTransaction on ct1.MasterTransactionID equals ct2.RelatedTransactionID
                    select new CT2 { ct1 = ct1, ct2 = ct2 };

    var query = baseQuery.Where(selection).Dump();
}

Expression<Func<CT2, bool>> query2 =
       r => r.ct1.CustomerID != r.ct2.CustomerID;

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