我可以在linq中克隆一个IQueryable吗?出于UNION的目的?

use*_*867 9 c# linq entity-framework

我有一张桌子WorkOrders.该表有一个PrimaryWorker&PrimaryPay字段.它还有一个SecondaryWorker&SecondaryPayfield(可以null).

我希望运行2个非常相似的查询并将它们联合起来,以便它返回一个WorkerField&Payfield.所以,如果一个WorkOrder记录有两个PrimaryWorkerSecondaryWorker外地人口,我会得到2条记录回来.

这两个查询中的"where子句"部分非常相似且很长.这是一个虚拟的例子

var q = ctx.WorkOrder.Where(w => w.WorkDate >= StartDt && w.WorkDate <= EndDt);

if(showApprovedOnly)
{
   q = q.Where(w => w.IsApproved);
}
//...more filters applied
Run Code Online (Sandbox Code Playgroud)

现在我也有一个名为的搜索标志hideZeroPay.如果这是真的,我不想在工人支付0美元的情况下包括记录.但显然对于1个查询我需要比较该PrimaryPay字段,而另一个我需要比较该SecondaryPay字段.

所以我想知道如何做到这一点.

我可以克隆我的基本查询q并从中进行主要和辅助工作者查询,然后将这两个查询合并在一起吗?

DHN*_*DHN 7

嗯,我不确定我是否理解你的意图。但是我认为克隆不是必需的。为什么不从基本查询中拆分两个新查询?


var baseQuery = ctx.WorkOrder.Where(w => w.WorkDate >= StartDt && w.WorkDate <= EndDt);

IQueryable<WorkOrder> query1;
if (showApprovedOnly)
{
  query1 = baseQuery.Where(w => w.IsApproved);
}
//more filters on query1
...

IQueryable<WorkOrder> query2;
if (/*something*/)
  query2 = baseQuery.Where(w => w.SomeThing);
Run Code Online (Sandbox Code Playgroud)

定义查询后,您可以解释它们(按枚举)并检索不同的结果。


var res1 = query1.ToList();
var res2 = query2.ToList();
Run Code Online (Sandbox Code Playgroud)