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),值是otherItemSequence
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);