Невозможно понять, как делать соединения в IQueryable - PullRequest
1 голос
/ 25 августа 2010

Вот что я пытаюсь:

IQueryable query = this.MyRepository.GetShippingCollection();

IList<SomeListType> myList = query.Where(x => x.Settings
                                      .Where(y => y.SelectorID.Equals(5))
                                      .Count() > 0)
                                   .OrderBy(x => x.Order)
                                   .ToList();

Выдает эту ошибку: не удалось разрешить свойство: Settings.ID

Если я делаю это таким образом, это работает, но вызывает более 3000запросов на моем SQL Server:

IList<SomeListType> myList = this.MyRepository.GetShippingCollection().ToList();
myList = myList.Where(x => x.Settings
                        .Where(y => y.SelectorID.Equals(5))
                        .Count() > 0)
               .OrderBy(x => x.Order)
               .ToList();

Я знаю, что решение находится в использовании "Join".

Я смотрел примеры за последние пару часов и могу найти только примеры Joinв файле сопоставления.Я также нахожу примеры для «ICriteria».

Я не хочу создавать отдельные записи для всех моих сложных запросов в файле отображения, поэтому объединение в этом файле не будет работать.

Поскольку я использую Fluent NHibernate, я не использую «ICriteria».Я использую "IQueryable".Как объединить несколько таблиц в «IQueryable»?

Любая помощь с этим будет принята с благодарностью.Заранее спасибо.

1 Ответ

1 голос
/ 27 августа 2010

Если второй запрос выполняет 3000 запросов, он почти наверняка загружает коллекцию Settings. Когда вы перебираете список, вы получаете доступ к этой коллекции, и каждый раз NHibernate возвращается к базе данных, чтобы получить ее. Попробуйте установить режим выборки для свойства «Настройки» для загрузки в сопоставлении.

Кроме того, поставщик LINQ может быть проблемой. Какую версию NHibernate вы используете? Поставщик 2.x LINQ имеет некоторые реальные ограничения. Он был переопределен в стволе 3.0, но вам придется скачать и скомпилировать его из исходного кода.

Кстати, ICriteria vs IQueryable не имеет отношения к Fluent NHibernate. Criteria API и LINQ - это два поставщика, с помощью которых вы можете создавать запросы. Свободный NHibernate - это альтернативный способ настройки.

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