2014-11-04 50 views
1

我有2個表,我想匹配2個ID值。的LINQ如何加入並獲得2個表中的值

第一表

  • 標識 - 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; 
     } 

我得到這個錯誤:

An exception of type 'System.NullReferenceException' occurred in IYP.UserInterfaceLayer.dll but was not handled in user code

我想是因爲它無法找到10,30,40 ID值環失敗。如果我的Id值在2個表中相同(Id = 1,2,3,4,5)循環有效。

我怎樣才能做到這一點的LINQ?

回答

2

你基本上是尋找左聯接在LINQ。試試這個: -

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和模型2都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 希望這有助於:)

1

您應該使用加入 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 
     }; 

您加入的標識財產,任何價值,你不要在MODEL1找到,您使用默認(DefaultIfEmpty調用)。然後根據連接結果選擇生成的DepartmentId

1

試試這個

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