如何使用方法语法在 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 连接中添加多个条件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LINQ 中对单个连接中的多个字段进行连接

具有多个条件和子句的C#EF Linq语法查询

Linq Join 中的大于条件

LINQ:具有多个条件的左外连接

Linq to Sql:多个左外连接

如何使用方法语法在 linq to sql 中进行连接?