2016-06-24 4 views
2

こんにちはすべて、法ベースのクエリ

 Employee[] empCollection = 
      new Employee[]{ 

        new Employee() 
     { 
      Name = "Test1", 
      Salry = "1000", 
      Notes = new string[] { "A","B","C","D"} 
     }, 

     new Employee() 
     { 
       Name = "Test2", 
      Salry = "2000", 
      Notes = new string[] { "E","F","G","H"} 

      } 

      }; 


     var data = from e in empCollection 
        from n in e.Notes 
        select new { Name = e.Name, note = n }; 

Test1を:B のTest1:C Test1を:D Test2を:E Test2を:F Test2を:G Test2を:H

このクエリのsynatxに基づいた同等のメソッドを知りたいですか?

私はこの

var data = empCollection.Select(
      e => 
       e.Notes.Select(n => new 
       { 
        name = e.Name, 
        note = n 
       } 
       ) 
      ); 

を試してみました。しかし、私は、なぜforeachループで名前やノートを取得することはできませんよ?

ありがとうございました。

+3

最初に私はリコメンデーションを持っています - ソフトウェア「linqpad」をチェックすると、それらのものを手にするのに役立ちます! –

答えて

3

あなたのコードはIEnumerable<IEnumerable<T>>返し、あなたはIEnumerable<T>にあなたの結果を「平ら」にSelectManyを使用する必要があります:あなたは、元のメソッドの構文にクエリから、コンパイラによって行わ機械翻訳は、過負荷を使用しています

the documentationパー
var data = empCollection 
    .SelectMany(e => e.Notes.Select(n => new {name = e.Name, note = n})); 

、 2つの項目をプロジェクションで使用できるように匿名型を作成します(コンパイラが作成した変数名のため実際にコンパイルされません)。

var data = empCollection 
    .SelectMany(e => e.Notes, (e, n) => new {e, n}) 
    .Select($1 => new { name = $1.e.Name, note = $1.n }); 

もちろん、これはその後、簡略化することができ、あなたがどこかにある、とのコンパイラ生成コードと元のコード終わる:

var data = empCollection 
    .SelectMany(e => e.Notes, (e, n) => new {name = e.Name, note = n}); 

はデモのthis fiddleを参照してください。

+0

ありがとうございます。しかし、私はあなたが言及した結果のコレクションにこのコードを使用することはできません。 foreach(データ内のvarアイテム) { Console.WriteLine(item.Name + ":" + item.note); } – Roshan

+0

これに対応する等価メソッドベースのクエリ。
var data = em from empCollection from n.Notes 新しい{Name = e.Name、note = n}を選択します。 – Roshan

+0

ありがとうございました。それはうまくいった。 – Roshan

関連する問題