c# – 如何对记录进行分组并仅检索具有前N个记录的第一个组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何对记录进行分组并仅检索具有前N个记录的第一个组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2654字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何对记录进行分组并仅检索具有前N个记录的第一个组](/upload/InfoBanner/zyjiaocheng/820/8461cd906d8746fcb49fba28663f7a7f.jpg)
我有以下记录集
ID BatchID ClientName CreatedDateTime
----------- -------------- --------------- -----------------------
1 NULL B 2018-02-16 19:07:46.320
2 NULL B 2018-02-16 19:07:46.320
3 NULL B 2018-02-16 19:07:46.597
4 NULL B 2018-02-16 19:07:46.597
5 NULL B 2018-02-16 19:10:10.260
6 NULL B 2018-02-16 19:10:10.260
7 NULL B 2018-02-16 19:21:34.303
8 NULL B 2018-02-16 19:21:34.303
9 NULL B 2018-02-16 19:21:44.780
10 NULL B 2018-02-16 19:21:44.780
11 NULL A 2018-02-16 19:24:35.623
12 NULL A 2018-02-16 19:24:35.623
13 NULL A 2018-02-16 19:24:42.867
14 NULL A 2018-02-16 19:24:42.867
我在EF Core中使用LINQ to SQL.
我想过滤BatchID为NULL的记录,然后按CreatedDateTime对过滤后的记录进行排序,然后按ClientName对它们进行分组,然后从第一个组中取出前5个记录.
根据上面给定的记录集,它应返回ClientName B的Ids 1,2,3,4,5的记录
所以这是我的查询
var result = await _DBContext.BatchRequests
.Where(x => x.BatchID.HasValue == false)
.OrderBy(x => x.CreatedDateTime)
.GroupBy(x => x.ClientName)
.FirstAsync();
问题
1 GT;查询返回客户端A.
2 – ;我如何只获取前5条记录
更新1
Sql Profiler显示以下内容,它甚至不在SQL中进行分组
SELECT [x].[ID], [x].[BatchID], [x].[ClientName], [x].[CreatedDateTime]
FROM [BatchRequests] AS [x]
WHERE CASE
WHEN [x].[BatchID] IS NULL
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END <> 0
ORDER BY [x].[ClientName]
解决方法:
首先,如果在Queryable实现中跟随GroupBy,将LINQ查询转换为SQL,则OrderBy通常没有效果(被忽略).
其次,EF Core目前不会将GroupBy查询转换为SQL,而是在内存中处理它们(所谓的client evaluation),这使得它们非常低效.考虑到这一点,您最好将工作拆分为两个查询 – 一个用于获取第一个组的ClientName,第二个用于获取所需的结果:
var baseQuery = _DBContext.BatchRequests
.Where(x => x.BatchId == null)
.OrderBy(x => x.CreatedDateTime);
var clientName = await baseQuery
.Select(x => x.ClientName)
.FirstOrDefaultAsync();
var result = await baseQuery
.Where(x => x.ClientName == clientName)
.Take(5)
.ToListAsync();
Actualy你可以结合这两个查询,但我不确定它是否会更有效(可能更糟):
var baseQuery = _DBContext.BatchRequests
.Where(x => x.BatchId == null)
.OrderBy(x => x.CreatedDateTime);
var result = await baseQuery
.Where(x => x.ClientName == baseQuery.Select(y => y.ClientName).FirstOrDefault())
.Take(5)
.ToListAsync();
内容总结
以上是互联网集市为您收集整理的c# – 如何对记录进行分组并仅检索具有前N个记录的第一个组全部内容,希望文章能够帮你解决c# – 如何对记录进行分组并仅检索具有前N个记录的第一个组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。