【发布时间】:2010-06-14 20:45:34
【问题描述】:
我有一张WorkOrders 的表格。该表有一个PrimaryWorker 和PrimaryPay 字段。它还有一个SecondaryWorker & SecondaryPay 字段(可以是null)。
我希望运行 2 个非常相似的查询并将它们合并,以便它返回一个 Worker 字段和 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 并从中进行主要和次要工作人员查询,然后将这 2 个查询合并在一起吗?
【问题讨论】:
-
如果能够为另一个 DbContext 实例克隆 IQueryable(没有人提供任何方法),那就太好了。就目前而言,如果您为一个 DbContext 实例构建一个复杂的查询,则无法将它重用于另一个 DbContext。您可以创建一个助手来构建它,但您仍然必须重新构建它。这似乎是很多不必要的开销。例如,如果您只想在同一个 IQueryable 上并行运行 CountAsync 和 Skip/Take/ToListAsync,则不能,因为要安全地并行运行它们,您需要两个单独的 DbContext 实例。
标签: c# linq entity-framework