Запрос дочерних коллекций был постоянной проблемой в наших приложениях, где мы используем NHibernate (через LINQ). Я хочу выяснить, как сделать это правильно. Я просто пытался навсегда заставить этот запрос работать эффективно, используя LINQ, и сдался. Может кто-нибудь помочь мне понять лучший способ сделать что-то подобное?
Model: ServiceProvider
HasMany->ServicesProvided
Гвоздь здесь в том, что HasMany отображается как компонент, поэтому я не могу напрямую запросить ServicesProvided. Для потомков, вот карта:
public ServiceProviderMap()
{
DiscriminatorValue(ProfileType.SERVICE_PROVIDER.ID);
HasMany(p => p.ServicesProvided)
.Table("ServiceProvider_ServicesProvided")
.KeyColumn("ProfileID")
.Component(spMapping =>
{
spMapping.Map(service => service.ID)
.Not.Nullable();
})
.AsBag();
}
Запрос, который я пытаюсь создать, вернул бы набор счетчиков для каждой предоставляемой службы. IE: Service1 -> 200, Service2 -> 465 и т. Д.
Мне удалось заставить запрос работать с использованием HQL, так что вот оно. Обратите внимание, что он просто возвращает идентификатор предоставляемой услуги:
select service.ID, count(service)
from ServiceProvider as profile
inner join profile.ServicesProvided as service
group by service.ID
Мне удалось заставить запрос "работать" с помощью LINQ, но он выполнялся ужасно. Вот код, который я использовал (предупреждение - это ужасно).
Func<ServiceProvider, IEnumerable<ServicesProvided>> childSelector = sp => sp.ServicesProvided;
var counts = this._sessionManager.GetCurrentSession().Linq<ServiceProvider>()
.Expand("ServicesProvided")
.SelectMany(childSelector, (t, c) => new { t = t, c = c })
.Select(child => child.c)
.GroupBy(sp => sp.ID)
.Select(el => new { serviceID = el.Key, count = el.Count() });
Мне бы очень хотелось узнать, как это сделать правильно, пожалуйста.