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

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

记录的 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

完整代码位于错误报告中使用 GroupBy 和 First 时出现错误结果

更新2019-8-9


查询不应使用 ID。我已将其更改为非唯一属性。如果解决方案只向 SQLite 查询一次,我将不胜感激。


陪伴而非守候
浏览 138回答 1
1回答

皈依舞

最新的 NHibernate 5.3 LINQ 提供程序似乎仅支持 Select 中的聚合函数(MIN、MAX、COUNT...)用于“group by”查询。group by 查询不支持实体选择。作为一般解决方案,您可以使用以下方法使用子查询重写“group by”查询:var&nbsp;results&nbsp;=&nbsp;session.Query<A>() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(a&nbsp;=>&nbsp;a&nbsp;==&nbsp;session.Query<A>()&nbsp;//&nbsp;Subquery&nbsp;on&nbsp;same&nbsp;entity &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(sa&nbsp;=>&nbsp;sa.X&nbsp;==&nbsp;a.X)&nbsp;//&nbsp;Group&nbsp;BY&nbsp;key&nbsp;is&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.OrderBy(sa&nbsp;=>&nbsp;sa.Y)&nbsp;//&nbsp;Order&nbsp;By&nbsp;key&nbsp;is&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.First()&nbsp;//&nbsp;First&nbsp;entry&nbsp;in&nbsp;group &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;).ToList();原始“group by”查询供参考:var&nbsp;results&nbsp;=&nbsp;session.Query<A>() &nbsp;&nbsp;&nbsp;&nbsp;.GroupBy(a&nbsp;=>&nbsp;a.X) &nbsp;&nbsp;&nbsp;&nbsp;.Select(g&nbsp;=>&nbsp;g.OrderBy(y&nbsp;=>&nbsp;y.Y).First()) &nbsp;&nbsp;&nbsp;&nbsp;.ToList();
打开App,查看更多内容
随时随地看视频慕课网APP