2017-09-13 21 views
0

我有3個List對象(A,B,C)變量。他們每個人都有自己的屬性。如何製作多連接的短lambda?

我將它們連接到其他列表D,其中一些屬性與(A,B,C)屬性相同。

這就是我所做的。它適用於我,但我不滿意,因爲我不得不多次寫一些類似的線條。

IList<A> listA; 
IList<B> listB; 
IList<C> listC; 

... 

IList<D> listD = listA 
    .Join(listB, 
     a=> a.bId, b=> b.Id, 
     (a, b) => new 
     { 
      aId = a.Id, 
      aName = a.Name, 
      aSample = a.Sample, 
      bId = b.Id, 
      bName = b.Name, 
      bComment = b.Comment, 

      cId = b.cId, 
     }) 
    .Join(listC, 
     j => j.cId, c => c.Id, 
     (j, c) => new List<D>() 
     { 
      aId = j.aId, // <-- how to not re-write it again 
      aName = j.aName, // <-- 
      aSample = j.aSample, // <-- 
      bId = j.bId, // <-- 
      bName = j.bName, // <-- 
      bComment = j.bComment, // <-- 

      cId = c.Id, 
      cName = c.Name, 
      cInterval = c.Interval 
     }) 
    .ToList(); 

我要做的,所以我不需要寫:援助,aName,A樣品,投標,BNAME,bComment;在第二次加入?

回答

2

如果你不喜歡的查詢語法(這是優選這裏),就可以避免重複這樣:

var listD = listA 
    .Join(listB, 
     a => a.bId, b => b.Id, 
     (a, b) => new { a, b }) 
    .Join(listC, 
     ab => ab.b.cId, c => c.Id, 
     (ab, c) => new 
     { 
      aId = ab.a.Id, 
      aName = ab.a.Name, 
      aSample = ab.a.Sample, 
      bId = ab.b.Id, 
      bName = ab.b.Name, 
      bComment = ab.b.Comment, 
      cId = c.Id, 
      cName = c.Name, 
      cInterval = c.Interval 
     }) 
    .ToList(); 
2

您可以使用LINQ表達式語法而不是LINQ擴展方法更輕鬆地完成多個連接。在這種情況下,你會得到相同的結果,你貼有此LINQ表達式的代碼:

var listD = 
     from a in listA 
     join b in listB on a.bId equals b.Id 
     join c in listC on b.cId equals c.Id 
     select new { 
      aId = a.Id, 
      aName = a.Name, 
      aSample = a.Sample, 
      bId = b.Id, 
      bName = b.Name, 
      bComment = b.Comment, 

      cId = c.Id, 
      cName = c.Name, 
      cInterval = c.Interval 
     };