C# 将列表转换为字典

C# 将列表转换为字典,c#,entity-framework,dictionary,C#,Entity Framework,Dictionary,我有以下课程: 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; }

我有以下课程:

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; } 
   ...
}
标题
项目
具有一对多关系(每个
标题
具有多个
项目

我有以下

{{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
ItemSequence
=1),值是other
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}))
                                  .?
我应该使用哪种代码来代替

类似于:

var result =
   ctx
   .Headers
   .ToDictionary(          
      header => new {
         header.Id,
         header.Items.First().ItemSequence
      },
      header =>
         header
         .Items
         .Select(item => item.Value)
         .ToList()
   );
header.Items.OrderBy(item => item.ItemSequence).First().ItemSequence
假设所有标题至少有一项

仔细想想,您可能想要第一个有序的
ItemSequence
,在这种情况下,可以使用如下内容:

var result =
   ctx
   .Headers
   .ToDictionary(          
      header => new {
         header.Id,
         header.Items.First().ItemSequence
      },
      header =>
         header
         .Items
         .Select(item => item.Value)
         .ToList()
   );
header.Items.OrderBy(item => item.ItemSequence).First().ItemSequence
要忽略没有项目的标题,请使用:

ctx
.Headers
.Where(header => header.Items.Any())
...
比如:

var result =
   ctx
   .Headers
   .ToDictionary(          
      header => new {
         header.Id,
         header.Items.First().ItemSequence
      },
      header =>
         header
         .Items
         .Select(item => item.Value)
         .ToList()
   );
header.Items.OrderBy(item => item.ItemSequence).First().ItemSequence
假设所有标题至少有一项

仔细想想,您可能想要第一个有序的
ItemSequence
,在这种情况下,可以使用如下内容:

var result =
   ctx
   .Headers
   .ToDictionary(          
      header => new {
         header.Id,
         header.Items.First().ItemSequence
      },
      header =>
         header
         .Items
         .Select(item => item.Value)
         .ToList()
   );
header.Items.OrderBy(item => item.ItemSequence).First().ItemSequence
要忽略没有项目的标题,请使用:

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

在您想要的结果中,
ItemSequence
总是等于1。我认为这是多余的。 您可以按
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);
var listItems=新列表()
{
newitem(){Id=1,HeaderId=1,ItemSequence=1,Value=“A”},
newitem(){Id=2,HeaderId=1,ItemSequence=2,Value=“B”},
newitem(){Id=3,HeaderId=2,ItemSequence=1,Value=“C”},
newitem(){Id=4,HeaderId=2,ItemSequence=2,Value=“D”},
新项(){Id=5,HeaderId=2,ItemSequence=3,Value=“B”}
};
var lstGroup=(来自listItems中的项
按项分组。标题ID
进入gr
选择新的
{
HeaderId=组键,
ItemSequence=1,//它是多余的,您可以删除它。。。
ListValue=string.Join(“,”,gr.Select(x=>x.Value).ToList())//返回“A,B”,。。。。
}).ToDictionary(x=>new{x.HeaderId,x.ItemSequence},x=>x.ListValue);

在您想要的结果中,
ItemSequence
总是等于1。我认为这是多余的。 您可以按
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);
var listItems=新列表()
{
newitem(){Id=1,HeaderId=1,ItemSequence=1,Value=“A”},
newitem(){Id=2,HeaderId=1,ItemSequence=2,Value=“B”},
newitem(){Id=3,HeaderId=2,ItemSequence=1,Value=“C”},
newitem(){Id=4,HeaderId=2,ItemSequence=2,Value=“D”},
新项(){Id=5,HeaderId=2,ItemSequence=3,Value=“B”}
};
var lstGroup=(来自listItems中的项
按项分组。标题ID
进入gr
选择新的
{
HeaderId=组键,
ItemSequence=1,//它是多余的,您可以删除它。。。
ListValue=string.Join(“,”,gr.Select(x=>x.Value).ToList())//返回“A,B”,。。。。
}).ToDictionary(x=>new{x.HeaderId,x.ItemSequence},x=>x.ListValue);