鉴于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,因此它应该是外连接。
我的目的是以最少的数据往返次数获得结果,可能一次性完成。
答案 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(使用计数)并给出相同的结果。