Если вы хотите сделать это в 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();
, что дает очень эффективныйSQL от Linq (с использованием счетчика) и дает тот же результат.