【问题标题】:Linq to NHibernate - select count problemLinq to NHibernate - 选择计数问题
【发布时间】:2010-12-01 03:38:14
【问题描述】:

给定 A 类和 B 类

class A
{
 string Name;
 Ilist<B> BList;
}

class B
{
 string Name;
}

使用 FluentNH 映射,关系是多对多的,即 A 的 HasManyToMany(x => x.B)。B 没有参考 A。NH 版本是 2.1.2.4000。

应该是什么 linq 查询来选择每行包含 B.Name 的集合以及包含该 B 的 A 的计数?结果必须是具有 2 个字段的匿名类型列表:名称和数数。结果还应该包括所有 B,因此它应该是外连接。

我的目的是尽可能一次性获得最少往返数据库的结果。

【问题讨论】:

  • 什么收藏? A 的数组,B 的数组,或 IQueriable 的什么东西?请澄清您的问题)
  • 请包含您的映射文件?您使用的是 NH2.1.2 还是 NH3?您对 LINQ 查询的第一次尝试也有助于阐明您的意图。
  • @The_Smallest 和 @James 我编辑了这个问题,希望对您有所帮助。
  • 顺便说一句:“A”和“B”不是调用类的最佳方式。 “Category”和“SubCategory”,“User”和“Group”,更容易理解))
  • A 和 B 只是应用程序域中 2 个类的表示。它们不是真正的类名。

标签: linq nhibernate linq-to-nhibernate


【解决方案1】:

如果你想在 Linq 中一键完成,你可以这样做...

var result = Session.Linq<A>()
    .SelectMany(a => a.BList, (a, b) => new { b.Name, A = a.Id })
    .ToList()
    .GroupBy(x => x.Name)
    .Select(x => new { Name = x.Key, Count = x.Count() })
    .ToList();

NHibernate.Linq (2.1.2.4000) 似乎在SelectMany 之后无法处理GroupBy,因此第一个ToList 将所有数据拉入内存。这是低效的——SQL 计数会更好。

或者,您可以将延迟加载的集合添加到您的 B 类,该类可以返回到 A。如果您在中间使用多对多表,那应该很容易。

public class B
{
    public virtual string Name { get; set; }
    public virtual IList<A> AList { get; private set; }
}

您的查询只是变成...

var result = Session.Linq<B>()
    .Where(b => b.AList.Count > 0)
    .Select(b => new { b.Name, b.AList.Count }
    .ToList();

从 Linq 生成非常高效的 SQL(使用计数)并给出相同的结果。

【讨论】:

  • 感谢您的回答。要求是外连接,表 B 中的所有 B。(我编辑了这个问题,因为它似乎仍然不是很清楚)。但我猜从你的最后一个查询中删除 where 子句会做到这一点。我会尝试这种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2010-12-01
相关资源
最近更新 更多