取组中的每个第一个元素
Take each first element of the group by
如何使用 EF 5 获取组中的每个第一个元素?
var result = await context.SomeDbSet
.Where(...)
.GroupBy(x => new { x.SomeField, ... })
.Select(x => x.First())
.ToListAsync();
我收到不支持的异常。
如何正确重写查询?谢谢
你不能用分组来做到这一点。 SQL 有一个限制 - 使用 GROUP BY
你可以 select 只能分组键和聚合结果。此限制肯定会扩展到 LINQ to Entities
- 在 GroupBy
之后,您可以 select 仅对键和聚合结果进行分组。
这样的结果可以通过SQL和Window函数实现:
SELECT
r.*,
FROM
(
SELECT
s.*,
ROW_NUMBER() OVER(PARTITION BY s.SomeField1, s.SomeField2 ORDER BY s.SomeDate) AS RN
FROM SomeDbSet s
WHERE ...
) r
WHERE r.RN = 1
对于那些想继续使用 LINQ 的人,我建议扩展(免责声明:我是扩展创建者)linq2db.EntityFrameworkCore
并且您可以通过 LINQ 在上面编写查询
var rnQuery =
from s in context.SomeDbSet
where ...
select new
{
Data = s,
RN = Sql.Ext.RowNumber().Over()
.PartitionBy(s.SomeField1, s.SomeField2)
.OrderBy(s.SomeDate)
.ToValue()
}
var resultQuery = await rnQuery
.Where(r => r.RN == 1)
.Select(r => r.Data)
.ToLinqToDB();
var result = resultQuery.ToList();
// async variant may need ToListAsyncLinqToDB() call
// because of collision in async extension methods between EF Core and linq2db
var result = await resultQuery.ToListAsyncLinqToDB();
如何使用 EF 5 获取组中的每个第一个元素?
var result = await context.SomeDbSet
.Where(...)
.GroupBy(x => new { x.SomeField, ... })
.Select(x => x.First())
.ToListAsync();
我收到不支持的异常。
如何正确重写查询?谢谢
你不能用分组来做到这一点。 SQL 有一个限制 - 使用 GROUP BY
你可以 select 只能分组键和聚合结果。此限制肯定会扩展到 LINQ to Entities
- 在 GroupBy
之后,您可以 select 仅对键和聚合结果进行分组。
这样的结果可以通过SQL和Window函数实现:
SELECT
r.*,
FROM
(
SELECT
s.*,
ROW_NUMBER() OVER(PARTITION BY s.SomeField1, s.SomeField2 ORDER BY s.SomeDate) AS RN
FROM SomeDbSet s
WHERE ...
) r
WHERE r.RN = 1
对于那些想继续使用 LINQ 的人,我建议扩展(免责声明:我是扩展创建者)linq2db.EntityFrameworkCore
并且您可以通过 LINQ 在上面编写查询
var rnQuery =
from s in context.SomeDbSet
where ...
select new
{
Data = s,
RN = Sql.Ext.RowNumber().Over()
.PartitionBy(s.SomeField1, s.SomeField2)
.OrderBy(s.SomeDate)
.ToValue()
}
var resultQuery = await rnQuery
.Where(r => r.RN == 1)
.Select(r => r.Data)
.ToLinqToDB();
var result = resultQuery.ToList();
// async variant may need ToListAsyncLinqToDB() call
// because of collision in async extension methods between EF Core and linq2db
var result = await resultQuery.ToListAsyncLinqToDB();