如何使用方法语法在 LINQ 连接中添加多个条件
How to add multiple conditions in LINQ join using method syntax
我需要在连接上添加多个条件。在下面的 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) => new { 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();
现在可以了。它生成两个查询,与之前的许多查询相比,这很好。
变化:
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 中,我需要添加这样的条件。并且需要在这些条件下使用来自不同实体的值。这需要仅使用此 方法语法 来完成。我能够在查询语法中做到这一点。但要求是在幕后它应该生成一个查询或尽可能少的查询。使用多个“from”或多个“join”的查询语法执行多个 SELECT 查询。
我的第二个问题是,在注释掉的行上,我需要根据 r4.VersionNo==r3.VersionNo 进行过滤。失败了。
, ppp => ppp.r2.KeyColumn, t => t.KeyColumn && t.MyID==r1.MyID && t.Column2==r2 .Column2, (ppp, t) => new { 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();
现在可以了。它生成两个查询,与之前的许多查询相比,这很好。
变化:
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();