【发布时间】:2018-07-27 19:30:27
【问题描述】:
我有以下记录集
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 个记录 组。
根据上面给定的记录集,它应该返回 ID 为 1、2、3、4、5 的记录,用于 ClientName B
这是我的查询
var result = await _DBContext.BatchRequests
.Where(x => x.BatchID.HasValue == false)
.OrderBy(x => x.CreatedDateTime)
.GroupBy(x => x.ClientName)
.FirstAsync();
问题
1>查询返回ClientA
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]
【问题讨论】:
-
您的
OrderBy在GroupBy之后没有多大意义 - 您必须订购组。那么你想如何订购这些组? (另外,一个简单的x.BatchID == null可能会产生更好的 SQL。) -
仅供参考,EF Core 与 LINQ to SQL 或 EF6 没有任何共同之处。例如,正如您已经注意到的,它目前不会将
GroupBy查询转换为 SQL。 -
那么分组必须在 SQL 中完成。检索内存中的所有记录并在内存中进行分组并只取前N个有什么用。
-
您将不得不等待 EF Core 2.1。这就是我认为 EF Core 尚未准备好投入生产的原因之一。
标签: c# entity-framework linq entity-framework-core ef-core-2.0