2009-11-03 7 views
3

Я пытаюсь заказать запрос Linq to NHibernate на сумму его детей.Linq-to-NHibernate OrderBy Not Working

session.Linq<Parent>().OrderBy(p => p.Children.Sum(c => c.SomeNumber)).ToList() 

Это не работает. При взгляде на NHProf я вижу, что он заказывает Parent.Id. Я понял, что, возможно, он возвращал результаты и заказывал их вне SQL, но если я добавлю .Skip (1). Получите (1) запрос Linq, он все равно заказывает Parent.Id.

Я попытался сделать это с помощью списка в памяти, и он работает только отлично.

Я делаю что-то не так, или это проблема с Linq до NHibernate?

Я уверен, что всегда могу вернуть список, а затем выполнить операции на , но это не идеальное обходное решение, потому что я не хочу, чтобы возвращал все записи.

ответ

2

Чтобы запросить запрос по совокупному значению, вам нужно использовать группу по запросу. В вашем примере вам нужно использовать «группу by» с соединением.

equivelant SQL будет что-то вроде:

select id, sum(child.parentid) as childsum from dbo.Parent 
inner join child on 
parent.id= child.parentid 
group by id 
order by childsum desc 

Если только Linq2NH могли бы сделать это для нас ... но это не может, к сожалению. Вы можете сделать это в HQL, пока вы в порядке с получением идентификатора, и сумма обратно, но не весь объект.

Я сражался с Linq2NH в течение нескольких месяцев, прежде чем покинул его. Он медленный, не поддерживает кеш второго уровня и поддерживает только ОЧЕНЬ основные запросы. (по крайней мере, когда я покинул его 6 месяцев назад - он, возможно, пришел не по дням, а по часам!) Его штраф, если вы делаете простое домашнее приложение. Если ваше приложение даже отдаленно сложно выровнять его и потратить немного времени на знакомство с HQL: немного сложнее понять, но гораздо более мощным.

+0

Причина, по которой я не хочу использовать HQL, рефакторинга. Повторный факторинг не будет захватывать строки HQL. По той же причине я использую FluentNHibernate вместо файлов .hbm. Мне нужно вернуть весь объект, хотя я просто хочу, чтобы он был заказан агрегатом. Я могу сделать это очень хорошо в SQL, поэтому HQL, вероятно, поддерживает его, если мне действительно нужно пройти этот маршрут. Я не уверен в производительности Linq2NH. Сейчас это кажется достаточно быстрым. Возможно, версия 1.0 имеет некоторые улучшения. Он должен пройти большинство тестов запросов NHibernate (поэтому я прочитал, даже не знаю, что они собой представляют). –

+0

http://hiberlog.wordpress.com/2009/02/16/lambda-expressions-extension-methods-and-nhibernate/ Вот страница, которую я сегодня опубликовал ранее, об использовании методов расширения для строгого запроса запросов Criteria. Я еще не читал его, но вы можете найти его интересным, так как вас беспокоит наличие строго типизированных запросов. Извините, я не мог больше помочь! – reach4thelasers

+0

Я раньше использовал NHLambdaExtensions. http://code.google.com/p/nhlambdaextensions/ Это работало очень хорошо, но мне очень не нравятся критерии. Я бы предпочел использовать HQL и проверять модульные тесты на наличие ошибок. –