2017-04-22 97 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);