以下在 NHibernate 中使用 LINQ 的代碼返回與內(nèi)存中 LINQ 和 EF LINQ 不同的結(jié)果。在 NHibernate 中執(zhí)行此操作的正確方法是什么?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實際結(jié)果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 時出現(xiàn)錯誤結(jié)果更新2019-8-9查詢不應使用 ID。我已將其更改為非唯一屬性。如果解決方案只向 SQLite 查詢一次,我將不勝感激。
1 回答

皈依舞
TA貢獻1851條經(jīng)驗 獲得超3個贊
最新的 NHibernate 5.3 LINQ 提供程序似乎僅支持 Select 中的聚合函數(shù)(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 關注
- 113 瀏覽
添加回答
舉報
0/150
提交
取消