Linq如何加入并获得2个表值

时间:2014-11-04 07:50:07

标签: c# asp.net-mvc linq

我有2个表格,我希望匹配2个Id值。

第一张表

  • Id - 1,2,3,4,5
  • DepartmentId - 2,4,5,2,1

第二张表

  • Id- 1,2,10,30,40

我想将第一张桌子的Id与第二张桌子的Id匹配,这样我就可以得到DepartmentId值。

我需要获得这个虚拟结果:

  • Id- 1,2,10,30,40
  • DepartmentId -2,4,null,null,null

这是我的代码:

       for (int i = 0; i < model1.Count(); i++)
    { 
model1[i].DepartmentId= model2.FirstOrDefault(k => k.Id== model1[i].Id).DepartmentId; 
      }

我收到此错误:

  

发生了'System.NullReferenceException'类型的异常   IYP.UserInterfaceLayer.dll但未在用户代码中处理

我认为循环失败是因为它无法找到10,30,40 Id值。如果我的Id值在2个表中相同(Id = 1,2,3,4,5),则循环工作。

我如何使用Linq执行此操作?

4 个答案:

答案 0 :(得分:2)

你基本上是在寻找LINQ中的Left Join。试试这个: -

 var query = from emp2 in Employee2
                        join emp1 in Employee1
                        on emp2.Id equals emp1.Id into allEmployees
                        from result in allEmployees.DefaultIfEmpty()
                        select new
                        {
                            ID = emp2.Id,
                            DeptID = result == null ? "No Department" : result.DepartmentId.ToString()
                        };

我使用了以下类型: -

          var Employee1 = new[]
            {
                new { Id = 1, DepartmentId  = 2 },
                new { Id = 2, DepartmentId  = 4 },
                new { Id = 3, DepartmentId  = 5 },
                new { Id = 4, DepartmentId  = 2 },
                new { Id = 5, DepartmentId  = 1 },
            };

        var Employee2 = new[] 
        {
            new { Id = 1 },
            new { Id = 2 },
            new { Id = 10 },
            new { Id = 30 },
            new { Id = 40 },
        };

完成工作Fiddle

答案 1 :(得分:1)

我将假设model1和model2都是IEnumerable。在这种情况下,以下情况应该有效。

var result = from x in model2
select
   new Model1Type {DepartamentId = x,
Value=
model1.FirstOrDefault(y=>y.DepartamentId==x)
.Select(y=>y.Value)};

这叫做Lamq:D 希望这会有所帮助:)

答案 2 :(得分:1)

您应该使用 Join LINQ扩展方法。以查询语法的形式(我相信在这种情况下更具可读性)它看起来像:

var matchedValues =
    from second in model2
    join first in model1
        on second.Id equals first.Id
        into temp
    from tempFirst in temp.DefaultIfEmpty()
    select
        new 
        {
            second.Id,
            DepartmentId = tempFirst == null ? null : tempFirst.DepartmentId
        };

您加入 Id 属性,对于您在 model1 中找不到的任何值,您使用默认值( DefaultIfEmpty 打电话)。然后根据连接结果选择生成的 DepartmentId

答案 3 :(得分:1)

试试这个

List<long> idlist=model2.tolist().select(t=>t.Id);
List<long> depIdList=model1.where(t=>idlist.contains(t.id)).toList();