Динамический 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 возникли проблемы с пониманием того, что происходит. У кого-нибудь есть идеи, как решить эту конкретную проблему?
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. Я думаю, что могу изменить фильтрующую часть аналогичным образом, но у меня еще не было времени поработать над этой частью.
Динамический QueryOver не имеет особого смысла.
Сам QueryOver является строго типизированным критерием. Используйте Критерии вместо QueryOver.
Вы должны использовать метод, который вы представили в этой ссылке "Dynamic Linq OrderBy". Проблема в вашем коде в том, что NHibernate не может разобрать это выражение.
Кроме того, я не совсем понимаю, почему вы пытаетесь отсортировать по значению внутри свойства, а не по самому свойству.
Предполагая, что вы пытаетесь отсортировать по имени свойства, все что вам нужно сделать, это:
1 - добавить "использование" для метода расширения в вашей ссылке
2 - используйте это как:
query.OrderBy(sort.Member);
Не пробовал, но должно работать.