2015-03-27 2 views
1

У меня есть 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, а также столбцам «Политики и процедуры».

Любая идея исправить это?

ответ

-1

изменить тип возвращаемого значения «IList» к «IEnumerable»

-1

изменить тип возврата к IEnumerable:

public IIEnumerable<Personne> GetForDTO(IList<int> ids) 
+0

я пытался ради него, но он не работает. Вы видите, что ToList() в операторе return - это то, что запускает все три запроса одновременно (за один проход к базе данных) и возвращает List <>. Проблема заключается в внутренней реализации fetch(). – user1174017

Смежные вопросы