c# - 有条件地加入 Linq

标签 c# linq

有没有办法逐步/有条件地向查询添加连接?我正在为客户创建一个自定义报告工具,并为客户提供了一个他/她可以选择查询的对象列表。查询中始终会使用一个基础对象(“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/

相关文章:

c# - LINQ 查询以选择与成对数组匹配的行

c# - 如何按字母顺序而不是 int 对枚举进行排序?

c# - 构建非重组三叉树时如何避免 C# 中的 System.OutOfMemoryException

c# - WCF 图像序列化

c# - 从控件子类化 ParentForm WndProc

c# - 如何在查询 C# 中使用 Linq 和 Dictionary 从 List<> 获取元素?

c# - Linq 查询 - 整理/优化

c# - 调试到 .net 源对我不起作用

c# - SqlDataReader 已经在不同的命令中打开

c# - 有没有办法在 LINQ 查询发生时观察它们?