Оптимизируйте запрос Nhibernate с помощью сопоставления по коду - PullRequest
2 голосов
/ 29 января 2012

У меня есть запрос nhibernate 3.2, который возвращает первые 500 элементов вмешательства (в исходном запросе есть фильтр)

var (from interv in Session.Query<Intervention>()
                .Fetch(rep => rep.ReponsePointVerification)
                orderby interv.DateModification
                select interv)
                .Take(500)
                .ToList();

Затем я повторяю все значения и использую значение ReponsePointVerification.

// a (very) simplified example
foreach (var intervention in listeInterventions)
  {
  foreach (var reponse in intervention.ReponsePointVerification)
    {

    }

  listeInterventionsws.Add(interventionws);
}

Этот запрос оптимизирован, но он не работает должным образом, потому что метод Take будет занимать 500 строк, а при наличии значения ReponsePointVerification у меня не будет 500 элементов Intervention.

Так что если яхочу заставить его работать, у меня есть 2 метода:

  • удалить Take (500) и взять только первые 500 вмешательств (тяжелые при увеличении базы данных)
  • Удалить выборку, но еслиУ меня будет 500 + 1 запрос.

Есть ли у nhibernate метод для обработки этого случая?

С уважением

Редактировать

Спасибо, Диего, это сработало.

Ну, я забыл упомянуть, что я использовал отображение по коду в nh 3.2

Размер пакета с отображением по коду можно настроить следующим образом:

Bag(x => x.ReponsePointVerification, map =>
{
  map.Key( k => k.Column( "IdIntervention" ) );
  map.BatchSize(50);
}, rm => rm.OneToMany()); 

ср.http://puredotnetcoder.blogspot.com/2011/07/mapping-conventions-with-mapping-by.html

1 Ответ

1 голос
/ 29 января 2012

Используйте batch-size при отображении затронутых коллекций вместо Fetch.

Это лучшее решение в 90% случаев.

(я собирался сделать ссылку на соответствующий раздел документации, но сайт сейчас не работает)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...