Что произойдет, если вы смешаете поддерживаемые и неподдерживаемые операторы в NHibernate? - PullRequest
1 голос
/ 28 февраля 2012

Насколько я знаю, когда я использую Linq, NHibernate поддерживает некоторые операторы и преобразует их в соответствующий SQL. Например, когда я создаю запрос, подобный этому

q => q.Where(foo => foo.Eligibility > 0)
                    .OrderBy(foo => foo.Eligibility);

Теоретически он будет правильно выполнять поиск и порядок в SQL.

Теперь, если я пытаюсь запросить это:

q => q.Where(foo => foo.Eligibility > 0)
                    .Except(blacklistedFoos)
                    .OrderBy(foo => foo.Eligibility);

Это дает мне ошибку (v2.0.50727 мы используем в производстве), потому что оператор кроме не поддерживается.

Теперь, если я создам HashSet blacklistedFooSet, чтобы справиться с этим,

q => q.Where(foo => foo.Eligibility > 0)
                .Where(foo=> !blacklistedFooSet.Contains(foo))
                .OrderBy(foo => foo.Eligibility);

Что будет? Будет ли NHibernate правильно переводить первое где и порядок, а затем вручную выполнять другое где за пределами базы данных? Каково общее правило для неподдерживаемых операторов / предложений?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2012

В подобных случаях есть один способ выяснить это - использовать инструмент профилирования, например NHProf , чтобы увидеть фактический сгенерированный SQL. Он действительно прост в использовании, и я считаю его обязательным при попытке выяснить, на что способен поставщик NH Linq.

Также стоит упомянуть, что в ближайшее время выйдет NHibernate 3.3, в котором есть множество исправлений, проблем и улучшений LINQ. Если вы не можете ждать, то вы можете извлечь последний источник из GitHub

0 голосов
/ 28 февраля 2012

Для проведения подобных экспериментов и понимания того, что на самом деле происходит с SQL, когда я что-то запрашиваю с помощью LINQ, я использую LINQPad.Это отличный софт, который переводит ваши запросы LINQ в SQL и показывает вам, что на самом деле происходит.Попробуйте, может быть, это поможет.

http://www.linqpad.net/

0 голосов
/ 28 февраля 2012

Операторы LINQ следуют за отложенным выполнением и фактически не будут выполняться, пока вы не перечислите запрос (то есть цикл foreach).Так как вы никогда не перечисляете в предоставленном вами коде, он будет пытаться перевести все в SQL, когда вы это делаете, за исключением любых ошибок в NHibernateLINQ (которых много).NHibernate поддерживает (может быть, не ваша версия, хотя). Содержит до 1000 или около того элементов, я считаю, так что это может работать.Если вы перечислите свой запрос следующим образом:

q => q.Where(foo => foo.Eligibility > 0).ToList()
            .Where(foo=> !blacklistedFooSet.Contains(foo))
            .OrderBy(foo => foo.Eligibility);

, тогда второй .Where и .OrderBy будут выполнены в вашем .NET-приложении.

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