Linq到NHibernate - 选择计数问题

时间:2010-11-29 22:30:26

标签: linq nhibernate linq-to-nhibernate

鉴于A和B类在哪里

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

class B
{
 string Name;
}

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

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

我的目的是以最少的数据往返次数获得结果,可能一次性完成。

1 个答案:

答案 0 :(得分:3)

如果你想在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)看起来GroupBy之后无法处理SelectMany,因此第一个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(使用计数)并给出相同的结果。