如何使用方法语法在 LINQ 连接中添加多个条件
Posted
技术标签:
【中文标题】如何使用方法语法在 LINQ 连接中添加多个条件【英文标题】:How to add multiple conditions in LINQ join using method syntax [duplicate] 【发布时间】:2021-06-22 17:56:10 【问题描述】:我需要在连接上添加多个条件。在下面的 LINQ 中,我需要添加类似这样的条件。并且需要在这些条件下使用来自不同实体的值。这需要使用这个方法语法来完成。我能够在查询语法中做到这一点。但要求是在后台它应该生成一个查询或尽可能少的查询。使用多个“from”或多个“join”的查询语法会执行多个 SELECT 查询。
我的第二个问题是,在注释掉的行上,我需要过滤 r4.VersionNo==r3.VersionNo。失败了。
, ppp => ppp.r2.KeyColumn, t => t.KeyColumn && t.MyID==r1.MyID && t.Column2==r2.Column2, (ppp, t) => 新 ppp, t )
试过(没用):
, ppp => ppp.r2.KeyColumn, t => (t.KeyColumn, t.MyID, t.Column2), (ppp, t) => new ppp, t )代码:
var result = repo1.Join(repo2, r1 => r1.KeyColumn, r2 => r2.KeyColumn, (r1, r2) => new r1, r2 )
.Join(repo3, ppp => ppp.r2.KeyColumn, t => t.KeyColumn, (ppp, t) => new ppp, t )
.Join(repo4, pppt => pppt.ppp.r2.KeyColumn, r4 => r4.VersionNo, (pppt, r4) => new pppt, r4 )
.Select(a => new MyObject
KeyColumn = a.ppp.r1.KeyColumn,
AnotherKeyColumn = a.ppp.r2.AnotherKeyColumn,
)?.ToList();
【问题讨论】:
不,它不起作用。我在上面链接中的一个示例中尝试了这一行。我得到“表达式树可能不包含元组文字” ppp => (ppp.p.ColumnName, ppp.p.AnotherColumn), t => (t.ColumnName, t.AnotherColumn)), (ppp, t) = > ppp) 对连接使用方法语法确实没有意义。这可以在查询语法中轻松完成,而无需更改已编译的查询。我很想知道您的查询语法是什么样的。也就是说,如果您使用导航属性,一切都会变得更简单。使用join
应该是必要的。
太糟糕了,我什至不想尝试去理解这个烂摊子。仅对此类查询使用查询语法。
【参考方案1】:
现在可以了。它生成两个查询,与之前的许多查询相比,这很好。
变化:
r4 => new
keycolumn1 = r4.keycolumn
versioncolumn = r4.VersionNo
,
pppt => new
keycolumn1 = pppt.ppp.r2.KeyColumn
versioncolumn = r4.VersionNo
,
最终代码:
var result =
repo1.Join(repo2, r1 => r1.KeyColumn, r2 => r2.KeyColumn, (r1, r2) => new r1, r2 )
.Join(repo3, ppp => ppp.r2.KeyColumn, t => t.KeyColumn, (ppp, t) => new ppp, t )
.Join(repo4,
pppt => new
keycolumn1 = pppt.ppp.r2.KeyColumn
versioncolumn = r4.VersionNo
,
r4 => new
keycolumn1 = r4.keycolumn
versioncolumn = r4.VersionNo
,
(pppt, r4) => new pppt, r4 )
.Select(a => new MyObject
KeyColumn = a.ppp.r1.KeyColumn,
AnotherKeyColumn = a.ppp.r2.AnotherKeyColumn
)?.ToList();
【讨论】:
以上是关于如何使用方法语法在 LINQ 连接中添加多个条件的主要内容,如果未能解决你的问题,请参考以下文章