В 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 ответ:
Чтобы упорядочить запрос по агрегатному значению,необходимо использовать запрос 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: немного сложнее понять, но намного мощнее.