繁体   English   中英

联接/与-从SQL转换为Lambda LINQ C#

[英]Join/AND - Translate from SQL to Lambda LINQ C#

我是LINQ和Lambda的新手,老实说,我不知道如何将我的单行查询转换为LINQ lambda。有人能将我引向正确的方向吗? 谢谢

这是我的一行查询:

        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_

您可以像这样在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} 它们为每个表中包含您感兴趣的两个字段的行创建匿名对象。仅当两个匿名对象比较相等时,连接成功。

其中的第三个lambda只是创建要作为“ joined”值返回的对象。 您可以创建所需的任何形状,该形状只是创建一个具有.Class1.Class2属性的对象,其中包含每个列表中匹配的行。 您可以根据需要将其展平,和/或添加所需的任何其他属性。

有关该语法的完整详细信息,请参见MSDN有关使用复合键的联接的页面。

我使用了以下2个替代类:

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文件在此处可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM