作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
以下在 NHibernate 中使用 LINQ 的代码返回与内存中 LINQ 和 EF LINQ 不同的结果。在 NHibernate 中执行此操作的正确方法是什么?如果 LINQ 版本确实损坏,可以使用 QueryOver
。
using (var session = factory.OpenSession())
using (var transaction = session.BeginTransaction())
{
for (int i = 0; i < 10; ++i)
{
session.Save(new A()
{
X = i % 2,
Y = i / 2,
});
}
transaction.Commit();
}
using (var session = factory.OpenSession())
using (var transaction = session.BeginTransaction())
{
//=====================================
var expected = session.Query<A>()
.ToList() // <-- copy to memory
.GroupBy(a => a.X)
.Select(g => g.OrderBy(y => y.Y).First())
.ToList();
Console.WriteLine(string.Join(" ", expected.Select(a => a.Id)));
//=====================================
var actual = session.Query<A>()
.GroupBy(a => a.X)
.Select(g => g.OrderBy(y => y.Y).First())
.ToList();
Console.WriteLine(string.Join(" ", actual.Select(a => a.Id)));
}
public class A
{
public int Id { get; set; }
public int X { get; set; } // indexed
public int Y { get; set; } // indexed
}
预期结果
1 2
实际结果
1 1
记录 SQL
NHibernate: select (select program_a0_.Id as id1_0_ from "A" program_a0_ order by program_a0_.Y asc limit 1) as col_0_0_ from "A" program_a0_ group by program_a0_.X
完整代码在错误报告中Incorrect result when using GroupBy with First
2019-8-9更新
查询不应使用 ID。我已将其更改为非唯一属性。如果解决方案只查询一次 SQLite,我将不胜感激。
最佳答案
似乎最新的 NHibernate 5.3 LINQ 提供程序在“分组依据”查询的选择中仅支持聚合函数(MIN、MAX、COUNT...)。 group by 查询不支持实体选择。
作为一般解决方案,您可以使用以下方法使用子查询重写“分组依据”查询:
var results = session.Query<A>()
.Where(a => a == session.Query<A>() // Subquery on same entity
.Where(sa => sa.X == a.X) // Group BY key is here
.OrderBy(sa => sa.Y) // Order By key is here
.First() // First entry in group
).ToList();
原始“分组依据”查询供引用:
var results = session.Query<A>()
.GroupBy(a => a.X)
.Select(g => g.OrderBy(y => y.Y).First())
.ToList();
关于c# - 如何在NHibernate中查询每个组中的第一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57268100/
我是一名优秀的程序员,十分优秀!