Предположим, у меня есть таблица с именем 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();
}
Очевидно, что реальный запрос является более сложным, и они являются множественными критериями выбора, и я стараюсь не дублировать запрос для каждого возможного критерия раздела.
Есть ли способ обойти это?