LINQ IQueryable with group by和count

时间:2018-03-27 21:00:25

标签: c# entity-framework linq asp.net-core

在我的.net Core 2.0 Razor Pages项目中,我声明了一个像这样的List,其中MyData是一个链接到Entity Framework数据集的模型:

public IList<MyData> MyData { get; set; }

为简单起见,我们假设我的数据如下:

ID | UserName | LogOn
1  | User1    | 25/03/2018 12:54
2  | User2    | 25/03/2018 09:43
3  | User1    | 24/03/2018 18:23
4  | User3    | 24/03/2018 08:16
5  | User2    | 23/03/2018 17:12

...等

然后在我的OnGet()方法中,我知道我可以查询这个以生成一个我可以循环的列表,如下所示:

IQueryable<MyData> MyDataIQ = from i in _context.MyData select i;

MyData = await MyDataIQ.ToListAsync();

如果我想返回一个按UserName分组的列表,该列表包含该UserName的所有出现次数,那么我的LINQ查询会是什么样的?

我试过这个:

IQueryable<MyData> MyDataIQ = from i in _context.MyData group i by i.UserName into grp select new {key = grp.Key, cnt = grp.Count()};

但这只是给我一个类型转换错误。

我有原始数据,我只想在以这种方式分组的视图中显示它。

我是Core 2.0和Linq的新手,所以任何帮助都会非常有用。

1 个答案:

答案 0 :(得分:1)

您将MyDataIQ声明为IQueryable<MyData>,但您正在创建匿名类型的IQueryable。

这应该有效:

var MyDataIQ = from i in ctx.MyData group i by i.UserName into grp select new { key = grp.Key, cnt = grp.Count() };

foreach (var a in MyDataIQ)
{
    Console.WriteLine($"{a.key} {a.cnt}");
}

结果:

User1 2
User2 2
User3 1
编辑:Ups,我看到Mike Hixson已在评论中回答。