为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
陪伴而非守候 2023-07-23 14:06:59
以下在 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();


查看完整回答
反对 回复 2023-07-23
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号