假设我有一个名为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();
}
显然,实际查询更为复杂,并且它们是多个选择条件,因此,我试图避免为每个可能的部分条件重复查询。
有没有办法解决?
炎炎设计
相关分类