有没有办法逐步/有条件地向查询添加连接?我正在为客户创建一个自定义报告工具,并为客户提供了一个他/她可以选择查询的对象列表。查询中始终会使用一个基础对象(“FWOBid”)。
因此,例如,如果客户选择对象“FWOBid”、“FWOItem”和“FWOSellingOption”,我想这样做:
var query = from fb in fwoBids
// if "FWOSellingOption", add this join
join so in sellingOptions on fb.Id equals so.BidId
// if "FWOItem", add this join
join i in fwoItems on fb.Id equals i.FWOBidSection.BidId
// select "FWOBid", "FWOItem", and "FWOSellingOption" (everything user has selected)
select new { FWOBid = fb, FWOSellingOption = so, FWOItem = i };
诀窍是客户可以选择大约 6 个彼此相关的对象,从而产生许多不同的连接组合。如果可能的话,我想避免对它们进行硬编码。
最佳答案
一种选择是结合左连接进行一些自定义连接。
一个体面的 TSQL 后端不应该因为总是使用所有连接而在性能方面有任何缺点,因为如果条件总是为假,优化器只会删除连接。但这应该检查一下。
bool joinA = true;
bool joinB = false;
bool joinC = true;
var query = from fb in fwoBids
join so in sellingOptions on new { fb.Id, Select = true } equals new { Id = so.BidId, Select = joinA } into js
from so in js.DefaultIfEmpty()
join i in fwoItems on new { fb.Id, Select = true } equals new { Id = i.FWOBidSection.BidId, Select = joinB } into ji
from i in ji.DefaultIfEmpty()
join c in itemsC on new { fb.Id, Select = true } equals new { Id = c.BidId, Select = joinC }
select new
{
FWOBid = fb,
FWOSellingOption = so,
FWOItem = i,
ItemC = c
};
关于c# - 有条件地加入 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29657975/