2017-12-18 8 views
0
foreach (var mkTPL in personalTemplate.MarketsType) { 
    foreach (var mkDB in currentPrintRow.Markets) { 
     if (mkTPL.IDMarketType == mkDB.IDMarketType) { 
      foreach (var selTPL in mkTPL.Selections) { 
       foreach (var selDB in mkDB.Selections) { 
        if (selTPL.IdSelectionType == selDB.IdSelectionType) { 
         selTPL.OddOrResultValue = selDB.OddOrResultValue; 
        } 
       } 
      } 
     } 
    } 
} 

は、これは私があなたがLINQのは、参加してこれらforeachループを「フラット化」することができるはず自分でLinqでこの変換を行うことは可能ですか?

foreach (var mkTPL1 in personalTemplate.MarketsType) 
      { 
       foreach (var selTPL in mkTPL1.Selections) 
       { 
        selTPL.OddOrResultValue = (from mkTPL in personalTemplate.MarketsType 
         join mkDB in currentPrintRow.Markets on mkTPL.IDMarketType equals mkDB.IDMarketType 
         from selDB in mkDB.Selections 
         where selTPL.IdSelectionType == selDB.IdSelectionType 
         select selTPL.OddOrResultValue).SingleOrDefault(); 
       } 
      } 
+3

確かに、それをLINQに変換することは可能です。 – Amy

+1

確かに、linqを使ってたくさんの魔法を使うことができますが、クエリで使用したいクラスの合理化されたバージョンを追加するのはどうですか? –

+0

@DanDohotaru:もちろん、私は – Revious

答えて

1

に達したソリューションです。大量のデータがある場合は、メモリを増やす代わりに高速化する必要があります。

var pt2pr = 
    from mkTPL in personalTemplate.MarketsType 
    join mkDB in currentPrintRow.Markets on mkTPL.IDMarketType equals mkDB.IDMarketType 
    select new { PersonalTemplate = mkTPL, PrintRow = mkDB }; 
foreach (var s in pt2pr.Select(p => 
    from selTPL in p.PersonalTemplate.Selections 
    join selDB in p.PrintRow.Selections on selTPL.IdSelectionType equals selDB.IdSelectionType 
    select new { selTPL, selDB } 
)) { 
    s.selTPL.OddOrResultValue = s.selDB.OddOrResultValue; 
} 

LINQ結合を1つのステートメントに結合できますが、2つの別々の結合を使用すると読みやすくなります。

+0

これはselTPLの値を変更しますか? – Revious

+1

@Reviousはい、 'PersonalTemplate.Selections'の項目は値型(構造体)ではない参照型(クラス)です。あなたの現在のコードが動作すれば、これは公正な仮定だと思います。 – dasblinkenlight

関連する問題