Динамический QueryOver в nHibernate

Подобно «Dynamic LINQ OrderBy', я хотел бы создать динамический QueryOver-OrderBy. Однако, когда я это делаю:

query.OrderBy(h => h.GetType().GetProperty(sort.Member).GetValue(h, null)).Asc

Я получаю исключение, которое говорит:

Unrecognised method call in epression h.GetType().GetProperty(value(Domain.Model.Repository+<>c__DisplayClass15).sort.Member).GetValue(h, null)

Судя по всему, у nHibernate есть проблемы с пониманием того, что происходит. Кто-нибудь знает, как решить эту конкретную проблему?


person Pieter    schedule 01.11.2011    source источник


Ответы (3)


Решение в связанном вопросе не работает, поскольку по-прежнему существует проблема, когда несколько объектов объединены, и сортировка должна выполняться для комбинации свойств из разных объектов. Единственное практическое решение, которое я мог придумать, состояло в том, чтобы создать словарь от sort.Member до Projection.Property.

var dict = new Dictionary<string, string>();
dict.Add("sortMember", "entityAlias.Property");
var sortOn = dict[sort.Member];
query.OrderBy(Projections.Property(sortOn)).Asc;

Это работает очень хорошо. Словарь в основном заменяет всю конструкцию if-else, а простой цикл добавляет orderBy. Я думаю, что я могу изменить фильтрующую часть аналогичным образом, но у меня еще не было времени поработать над этой частью.

person Pieter    schedule 02.11.2011

Динамический QueryOver не имеет особого смысла.

Сам QueryOver является строго типизированным критерием. Используйте критерии вместо QueryOver.

person Diego Mijelshon    schedule 01.11.2011
comment
Я использую строго типизированные функции QueryOver для построения основной части запроса. Просто фильтрация и сортировка в идеале должны быть динамическими, поскольку эти инструкции поступают из графического интерфейса. Я могу написать большой if-else, но более общее решение с использованием отражения было бы лучше, имхо. - person Pieter; 02.11.2011

Вы должны использовать метод, который вы представили в этой ссылке «Dynamic Linq OrderBy». Проблема в вашем коде в том, что NHibernate не может разобрать это выражение.

Кроме того, я действительно не понимаю, почему вы пытаетесь сортировать по значению внутри свойства, а не по самому свойству.

Предполагая, что вы пытаетесь отсортировать по имени свойства, все, что вам нужно сделать, это:

1 - добавьте «использование» для метода расширения в вашу ссылку

2 - используйте его как:

query.OrderBy(sort.Member);

Не пробовал, но должно работать.

person psousa    schedule 02.11.2011