Динамический QueryOver в nHibernate - PullRequest
1 голос
/ 01 ноября 2011

Аналогично ' 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 возникли проблемы с пониманием происходящего. У кого-нибудь есть идеи, как решить эту конкретную проблему?

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

Решение в связанном вопросе не работает, так как по-прежнему существует проблема, когда несколько сущностей объединяются, и сортировка должна выполняться по комбинации свойств из разных сущностей.Единственное практическое решение, которое я мог придумать, - создать словарь от 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.Думаю, я могу изменить фильтрующую часть аналогичным образом, но у меня еще не было времени поработать над этой частью.

0 голосов
/ 02 ноября 2011

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

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

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

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

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

query.OrderBy(sort.Member);

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

0 голосов
/ 02 ноября 2011

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

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

...