2017-04-22 22 views
1

を辞書に:私は、次のクラス持っ

{{Id=1, HeaderId=1, ItemSequence =1, Value="A"}, 
{Id=2, HeaderId=1, ItemSequence =2, Value="B"}, 
{Id=3, HeaderId=2, ItemSequence =1, Value="C"}, 
{Id=4, HeaderId=2, ItemSequence =2, Value="D"}, 
{Id=5, HeaderId=2, ItemSequence =3, Value="B"}} 

public class Header 
{ 
    public int Id { get; set; } 
    .... 
} 
public class Item 
{ 
    public int Id { get; set; } 
    public int HeaderId { get; set; } //FK 
    public int ItemSequence { get; set; } 
    public string Value { get; set; } 
    ... 
} 

HeaderItem 1対多の関係を持っています(各Headerは私がItemsを以下している多くのItems

を持っています

辞書を検索するためのクエリを書きたいと思っていますが、キーはまずItemSequenceの各です(= 1 ItemSequence)と値が他のItemSequence sの値である、私は次のような結果を達成したい、他の言葉で:

Key: {HeaderId=1, ItemSequence =1} , Values : {"A","B"} 
Key: {HeaderId=2, ItemSequence =1} , Values : {"C","D","B"} 

を、私は、クエリ、次の書いた:

私が代わりに使うべきコード
var result = ctx.Headers 
       .SelectMany(x => x.Items 
            .Select(t => new { t.Id,t.ItemSequence,t.HeaderId})) 
            .? 

??以下のような

答えて

0

何か:

var result = 
    ctx 
    .Headers 
    .ToDictionary(   
     header => new { 
     header.Id, 
     header.Items.First().ItemSequence 
     }, 
     header => 
     header 
     .Items 
     .Select(item => item.Value) 
     .ToList() 
    ); 

とはいえ、すべてのヘッダーは、少なくとも一つのアイテムを持っていることを前提としています。以下のようなものを使用その場合には、それについて考える

、それはあなたがItemSequenceを注文した最初のを望むことができます、:なしアイテムでヘッダを無視するには

header.Items.OrderBy(item => item.ItemSequence).First().ItemSequence 

は使用:あなたは

ctx 
.Headers 
.Where(header => header.Items.Any()) 
... 
0

を希望の結果、ItemSequenceは常に1に等しい。私はそれが冗長だと思う。 group by HeaderIdを使用して、このような辞書に変換できます。

 var listItems = new List<Item>() 
     { 
       new Item(){Id=1, HeaderId=1, ItemSequence =1, Value="A"}, 
       new Item(){Id=2, HeaderId=1, ItemSequence =2, Value="B"}, 
       new Item(){Id=3, HeaderId=2, ItemSequence =1, Value="C"}, 
       new Item(){Id=4, HeaderId=2, ItemSequence =2, Value="D"}, 
       new Item(){Id=5, HeaderId=2, ItemSequence =3, Value="B"} 
     }; 

     var lstGroup = (from item in listItems 
      group item by item.HeaderId 
      into gr 
      select new 
      { 
       HeaderId = gr.Key, 
       ItemSequence = 1, // it's redundant, you could remove it... 
       ListValue = string.Join(",", gr.Select(x => x.Value).ToList()) // return "A,B",.... 
      }).ToDictionary(x=>new {x.HeaderId,x.ItemSequence}, x=> x.ListValue); 
関連する問題