如何在LINQ中向分组结果添加更多列?

4

我有一个LINQ语句,它生成一个字符串集合:

enter image description here

我该如何更改这个LINQ查询,以便生成一个int/string数组集合,以便在我的结果中也包括语言ID?

类似于这样:

from u in Users
join l in Languages on u.LanguageId equals l.Id
group u by l.Name into g
orderby g.Count() descending
select new { Id = l.Id, NameAndCount = g.Key + " (" + g.Count() + ")" }

未成功的尝试:

在此输入图片描述

在此输入图片描述

在此输入图片描述

2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4
你可以通过 Id 对记录进行分组,然后使用 FirstOrDefault 获取 Name
from u in Users
join l in Languages on u.LanguageId equals l.Id
group l by l.Id into g
orderby g.Count() descending
select new { Id = g.Key, NameAndCount = g.First().Name + " (" + g.Count() + ")" }

尽管这告诉我:CS1061 'User'不包含“Name”的定义,也没有接受类型为“User”的第一个参数的扩展方法“Name”可用 - Edward Tanguay
没意识到,再更新一次!!现在应该可以为您工作了。 - Ipsit Gaur
我理解这个语法的意图,但是现在它告诉我:SQL逻辑错误或缺少数据库,靠近"(":语法错误,即使我只是简单地输入 select new { Id = g.Key, NameAndCount = g.First().Name } - Edward Tanguay
1
@EdwardTanguay 我运行了代码,并在最后更新后没有发现任何错误,请看一下 https://dotnetfiddle.net/g02hZl - Ipsit Gaur
Ipsit,非常好。我将你的.NET Fiddle代码复制到我的LINQPad中,它在那里也能正常工作。有趣的是,当数据来自我的SQLite数据库时,我会收到那个错误(见上面的截图)。无论如何,Maulana上面的方法:group l by new { l.Id, l.Name } into g可用于我的SQLite实现。 - Edward Tanguay
显示剩余2条评论

2
你只需要对你的代码进行微小的修改。不要按用户分组,而是按语言分组,并且为这个组添加两个字段/列。
from u in Users
join l in Languages on u.LanguageId equals l.Id
group l by new { l.Id, l.Name } into g
orderby g.Count() descending
select new { Id = g.Key.Id, NameAndCount = g.Key.Name + " (" + g.Count() + ")" }

另一个案例:

请注意,我们用于分组的每个字段都可以从.Key中访问,并且您可以为这些字段指定名称。

示例1:

// ...
group l by new { MyId = l.Id, MyName = l.Name } into g
orderby g.Count() descending
select new { Id = g.Key.MyId, NameAndCount = g.Key.MyName + " (" + g.Count() + ")" }

如果我们不想在结果中丢失集合,可以像下面的示例那样添加一个UserList变量。

示例2:

// ...
group l by new { l.Id, l.Name } into g
orderby g.Count() descending
select new { Id = g.Key.Id, NameAndCount = g.Key.Name + " (" + g.Count() + ")", UserList = g.ToList() }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,