linq加入1对多人获得第一记录

时间:2012-01-31 23:26:57

标签: linq

我有2个名单:

的List1:

ID 1 2 3

列表2:

ID名称

杰森,1 1吉姆 2迈克 3菲尔

我喜欢加入这两个,但只从list2获取给定ID的第一条记录: 最终结果将是

ID名称 1杰森 2迈克 3菲尔

我尝试了以下但未成功:

    var lst = (from lst1 in list1
               join lst2 in list2
               on lst1.ID equals lst2.ID).ToList().First();          

4 个答案:

答案 0 :(得分:7)

您可以使用101 LINQ Samples调用"Cross Join with Group Join"的内容获得此结果。将其与First()结合使用即可获得该组中的一个项目。

var lst = (
    from lst1 in list1
    join lst2 in list2 on lst1.ID equals lst2.ID into lstGroup
    select lstGroup.First()
);

示例: http://ideone.com/V0sRO

答案 1 :(得分:2)

这是一种方法:

var lst = list1
    // Select distinct IDs that are in both lists:
    .Where(lst1 => list2
        .Select(lst2 => lst2.ID)
        .Contains(lst1.ID))
    .Distinct()
    // Select items in list 2 matching the IDs above:
    .Select(lst1 => list2
        .Where(lst2 => lst2.ID == lst1.ID)
        .First());

示例: http://ideone.com/6egSc

答案 2 :(得分:1)

首先尝试按ID分组list2,然后从每个组中选择第一项。之后,进行连接并选择您想要的内容。

var uniqueIDList2 = list2.GroupBy(p => p.ID)
                         .Select(p => p.First());

var result = from lst1 in list1
             join lst2 in uniqueIDList2 on lst1.ID equals lst2.ID
             select new { lst1.ID, lst2.Name };

答案 3 :(得分:0)

另一种方式:

var query = from lst1 in list1
            let first = list2.FirstOrDefault(f => f.Id == lst1.Id)
            where first != null
            select first;

或者,如果您想了解list2中无法找到的项目:

var query = from lst1 in list1
            let first = list2.FirstOrDefault(f => f.Id == lst1.Id)
            select first ?? new { Id = 0, Name = "Not Found" };