2017-04-22 74 views
1

我有以下類:轉換列表字典

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有一個一對多的關係(每個Header有很多Items

我有以下Items

{{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"}} 

我想寫一個查詢來查找字典,關鍵是每個的第一個(ItemSequence = 1)和值是其它ItemSequence的價值觀,在其它字我想達到以下結果:

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);