Есть ли какое-либо отличие от получения значений из Object или выполнения другого запроса? - PullRequest
0 голосов
/ 10 апреля 2011

Я использую nhibernate с беглым nhibernate.

Мне интересно, есть ли разница между этими двумя способами.

  1. Сделайте запрос, чтобы получить коллекцию объектов из БД(скажем, собрание компаний).
  2. Теперь мне нужно получить другую таблицу, на которую ссылаются продукты (скажем, продукты).

Вариант 1

 var companies = session.Query<Companies>().ToList();
companies.Where(x => x.products.Id == 1).toList();

Итак, яФильтрую на объекте результата.Я буду что-то делать со всеми компаниями, но позже мне нужно будет отфильтровать это, чтобы заняться другими делами

Вариант 2.

сделать еще один запрос nhiberante все вместе.

 var companies = session.Query<Companies>().ToList();
 var products = session.Query<Companies>().Where(x => x.products == 1).ToList();

Я предполагаю, что если я получу / хочу загрузить все, тогда будет разница (в производительности, количестве запросов и т. Д.).

Но как быть, если я загружаюсь?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Я предполагаю, что вы хотите, чтобы второй запрос отфильтровал Companies с Product с Id == 1. Тогда ваши запросы должны выглядеть примерно так:

Опция 1:

var companies = session.Query<Companies>().ToList();
var companiesWithSpecificProductId = 
    companies.Where(x => x.Products.Any(p => p.Id == 1)).ToList();

Вариант 2:

var companies = session.Query<Companies>().ToList();
var companiesWithSpecificProductId = 
    session.Query<Companies>().Where(x => x.Products.Any(p => p.Id == 1)).ToList();

В случае отложенной загрузки вариант 1 приведет к проблеме N + 1, поскольку NHibernate должен будет запросить IList<Product> Products для каждого счета всписок.В большинстве сценариев это будет намного медленнее, чем в варианте 2, где NHibernate сможет выполнить все это в одном запросе, используя подзапрос EXISTS.

0 голосов
/ 10 апреля 2011

Я думаю, у вас есть ошибки в коде.Разве это не должно быть:

var companies = session.Query<Companies>().ToList();
var products = companies.SelectMany(x => x.Products).Where(q => q.Id == 1).ToList();

и

var companies = session.Query<Companies>().ToList();
var products = session.Query<Products>().Where(x => x.Id == 1).ToList();

?

Даже если ответ не однозначный.Это потому, что вам решать, нужно ли вам интенсивно запрашивать продукты или нет.Я бы запустил sql profiler и просто сравнил оба подхода во время юнит-тестов.

Но пытаясь хоть немного помочь, я обычно использую вариант 2. Я выбираю вариант 1 только в определенных сценариях.

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