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

时间:2010-06-14 20:45:35

标签: c# linq entity-framework

我有一张WorkOrders的表格。该表格有一个PrimaryWorker& PrimaryPay字段。它还有一个SecondaryWorker& SecondaryPay字段(可以是null)。

我希望运行2个非常相似的查询&联合它们以便返回Worker Field& Pay字段。因此,如果单个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

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

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

我可以克隆我的基本查询q并制作一个主要&amp;二级工人查询它然后将这两个查询结合在一起?

2 个答案:

答案 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是作为一个对象创建的,而查询本身只有在枚举后才会运行。