我有两种型号-国家:
public int id { get; set; }
public string CountryName { get; set; }
和FlagColor:
public int id { get; set; }
public string Color { get; set; }
public virtual Country Country { get; set; }
我正在尝试从linq查询创建一个对象,该查询将输出
的对象
目前我有
var combinedList = from c in countries
join fc in flagColors on c.id equals fc.Country.id
select new {c, fc};
这几乎到了,但是每个flagColor返回一行,例如
比利时:红色
比利时:黑色 等等
如何将查询转换为输出:
贝尔吉姆(Belguim):{红色,黑色,黄色}
答案 0 :(得分:1)
提示:在LINQ中,您几乎不需要使用连接,大多数情况下,它是通过关系隐含的。
var combinedList = from fc in flagColors
group fc by fc.Country into g
select new
{
Country = g.Key.CountryName,
FlagColors = string.Join(",", g.Select(x => x.Color))
};
注意:我将其设为易于阅读的逗号分隔值。对于列表,您可以执行以下操作:
var combinedList = from fc in flagColors
group fc by fc.Country into g
select new
{
Country = g.Key.CountryName,
FlagColors = g.Select(x => x.Color).ToList()
};
或者如果您想获取字典:
var combinedList = (from fc in flagColors
group fc by fc.Country into g
select new
{
Country = g.Key.CountryName,
FlagColors = g.Select(x => x.Color).ToList()
}).ToDictionary(l => l.Country, l=>l.FlagColors);
更短:
var combinedList = flagColors
.GroupBy(fc => fc.Country)
.ToDictionary(
g => g.Key.CountryName,
g=>g.Select(c => c.Color).ToList()
);
答案 1 :(得分:1)
使用Queryable.GroupBy(或相应的Enumerable.GrouBy)
首先将所有标记颜色分组到所有标记颜色都具有相同countryName的组中。然后从每个组中创建一个对象,并使用该区域的国家名称和所有标记颜色的列表:
var result = flagColors
.GroupBy(flagColor => flagColor.Country.CountryName)
.Select(group => new
{
CountryName = group.Key, // get common CountryName
FlagColors = group // get the color of all elements
.Select(groupElement => groupElement.Color) // in the group
.ToList(),
})