以下在 NHibernate 中使用 LINQ 的代码返回与内存中 LINQ 和 EF LINQ 不同的结果。在 NHibernate 中执行此操作的正确方法是什么?QueryOver如果LINQ版本确实有问题的话,也可以使用。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记录的 SQLNHibernate: 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完整代码位于错误报告中使用 GroupBy 和 First 时出现错误结果更新2019-8-9查询不应使用 ID。我已将其更改为非唯一属性。如果解决方案只向 SQLite 查询一次,我将不胜感激。
1 回答

皈依舞
TA贡献1851条经验 获得超3个赞
最新的 NHibernate 5.3 LINQ 提供程序似乎仅支持 Select 中的聚合函数(MIN、MAX、COUNT...)用于“group by”查询。group by 查询不支持实体选择。
作为一般解决方案,您可以使用以下方法使用子查询重写“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();
原始“group by”查询供参考:
var results = session.Query<A>() .GroupBy(a => a.X) .Select(g => g.OrderBy(y => y.Y).First()) .ToList();
- 1 回答
- 0 关注
- 137 浏览
添加回答
举报
0/150
提交
取消