加入/ AND - 从SQL转换为Lambda LINQ C#

时间:2017-10-17 14:19:39

标签: c# linq lambda

我是LINQ和Lambda的新人,说实话,我不知道如何将我的一行查询翻译成LINQ lambda。任何人都可以指引我朝着正确的方向前进吗? THX

这是我的一行查询:

        SELECT *    
        FROM
   dbo.[Sales Invoice Line] innerjoin
            dbo.[Sales Comment Line] ON 
            dbo.[Sales Invoice Line].[Line No_] = dbo.[Sales Comment Line].[Document Line No_] AND 
            dbo.[Sales Invoice Line].[Document No_] = dbo.[Sales Comment Line].No_

1 个答案:

答案 0 :(得分:0)

您可以在Linq中进行多字段连接,如下所示:

var List1 = new List<Class1>();
List1.Add(new Class1 { Field1 = 1, Field2 = 2 });
List1.Add(new Class1 { Field1 = 3, Field2 = 4 });

var List2 = new List<Class2>();
List2.Add(new Class2 { Field1 = 1, Field2 = 2 });
List2.Add(new Class2 { Field1 = 5, Field2 = 6 });

var results = List1.Join(List2, 
                         l1 => new {l1.Field1, l1.Field2}, 
                         l2 => new {l2.Field1, l2.Field2},
                         (l1, l2) => new {List1 = l1, List2 = l2});

这里的关键是2个lambdas l1 => new {l1.Field1, l1.Field2}l2 => new {l2.Field1, l2.Field2}。这些为每个表中的行创建了包含您感兴趣的两个字段的匿名对象。只有当两个匿名对象比较相等时,连接才会成功。

那里的第3个lambda只是创建了一个返回的对象,因为&#34;加入&#34;值。你可以创建你想要的任何形状,这个只是创建一个包含.Class1.Class2属性的对象,其中包含每个列表中匹配的行。如果您愿意,可以将其展平,和/或添加您需要的任何其他属性。

有关此语法的完整详情,请访问joins using composite keys上的MSDN页面。

我使用了以下两个替身课程:

class Class1
{
    public int Field1 { get; set; }
    public int Field2 { get; set; }
}

class Class2
{
    public int Field1 { get; set; }
    public int Field2 { get; set; }
}

LINQPad文件可用here