В LINQ для NHibernate на Заказпо не работает


Я пытаюсь упорядочить запрос Linq to NHibernate по сумме его дети.

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

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

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

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

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

1 3

1 ответ:

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

Эквивелантный 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 в течение нескольких месяцев, прежде чем я оставил его. Его медленно, не поддерживает 2-й уровень кэш и поддерживает только очень простые запросы. (по крайней мере, когда я бросил его 6 месяцев назад - он, возможно, пришел не по дням, а по часам!) Это прекрасно, если вы делаете простое домашнее приложение. Если ваше приложение даже отдаленно сложно, бросьте его и потратьте немного времени, чтобы узнать HQL: немного сложнее понять, но намного мощнее.