我有一张WorkOrders
的表格。该表格有一个PrimaryWorker
& PrimaryPay
字段。它还有一个SecondaryWorker
& SecondaryPay
字段(可以是null
)。
我希望运行2个非常相似的查询&联合它们以便返回Worker
Field& Pay
字段。因此,如果单个WorkOrder
记录同时填充了PrimaryWorker
和SecondaryWorker
字段,则会返回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
现在我还有一个名为hideZeroPay
的搜索标记。如果这是真的,我不想在工人支付0美元的情况下包括记录。但显然对于1个查询我需要比较PrimaryPay
字段,而另一个我需要比较SecondaryPay
字段。
所以我想知道如何做到这一点。
我可以克隆我的基本查询q
并制作一个主要&amp;二级工人查询它然后将这两个查询结合在一起?
答案 0 :(得分:5)
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);
定义查询后,您可以解释它们(按枚举)并检索不同的结果。
var res1 = query1.ToList();
var res2 = query2.ToList();
答案 1 :(得分:0)
当您执行第二次实际克隆查询的位置时。
在这里,您可以创建初始可查询对象。
var q = ctx.WorkOrder.Where(w => w.WorkDate >= StartDt && w.WorkDate <= EndDt);
在这里,您可以使用相关联的
创建一个新的可查询对象if(showApprovedOnly)
{
q = q.Where(w => w.IsApproved);
}
//...more filters applied
您需要做的就是创建一个新变量来存储修改后的查询。
var qw = q.Where(w=> w.IsApproved);
这是有效的,因为queryable是作为一个对象创建的,而查询本身只有在枚举后才会运行。