У меня есть Personne (person) объект с подпакетами. Политики и процедуры. Я хочу загрузить пакет Personnes с теми же загруженными коллекциями, используя мощь будущих запросов. Но! Меня попросили не дублировать столбцы Personne в запросах, получающих Политики и Процедуры, которые кажутся разумными для оптимизации объема данных, перемещающихся из базы данных на сервер.Использование FetchMany и выбор в Linq для запроса NHibernate
Вот что я в итоге сделал.
public IList<Personne> GetForDTO(IList<int> ids)
{
IEnumerable<Personne> query = NHibernateSession.Current.Query<Personne>()
.Fetch(x => x.Adresse)
.Where(x => ids.Contains(x.Id))
.ToFuture();
var queryWithPolices = NHibernateSession.Current.Query<Personne>()
.FetchMany(x => x.Polices)
.Where(x => ids.Contains(x.Id))
.Select(x => new
{
x.Id,
x.Polices
})
.ToFuture();
var queryWithProcedures = NHibernateSession.Current.Query<Personne>()
.FetchMany(x => x.Procedures)
.Where(x => ids.Contains(x.Id))
.Select(x => new
{
x.Id,
x.Procedures
})
.ToFuture();
return query.ToList();
}
Этот запрос не работает, с ошибкой: Collections.IList»не может быть использован для параметра типа 'System.Collections.Generic.IEnumerable`1 [System.Object]'
Это работает, если я удаляю вызов линии Select(), но, конечно, это приводит к извлечению столбцов Personne, а также столбцам «Политики и процедуры».
Любая идея исправить это?
я пытался ради него, но он не работает. Вы видите, что ToList() в операторе return - это то, что запускает все три запроса одновременно (за один проход к базе данных) и возвращает List <>. Проблема заключается в внутренней реализации fetch(). – user1174017