gpt4 book ai didi

c# - 如何在NHibernate中查询每个组中的第一个条目

转载 作者:太空狗 更新时间:2023-10-29 20:22:44 25 4
gpt4 key购买 nike

以下在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com