Сортировка в EF с репозиторием и сервисным уровнем

У меня есть несколько классов, которые реализуют общий интерфейс репозитория, один из методов в этих классах — это метод, который возвращает выгружаемый результат и принимает

Expression<Func<T, bool>> OrderBy

Я также создал сервисный уровень, который будет использовать классы репозитория, поскольку я читал, что не рекомендуется отправлять объект Expression из пользовательского интерфейса на сервисный уровень, поэтому я решил отправить его как параметр, если я отправлю его как строку, содержащую имя параметра, как я могу преобразовать строку в качестве свойства, которое будет использоваться в объекте выражения, например, предположим, что у меня есть сущность с именем «Пользователь», и я отправляю методу параметр с именем «Имя пользователя», как я могу преобразовать «Имя пользователя» должно быть превращено в свойство «Имя пользователя», которое можно использовать в объекте Expression> OrderBy?

если возможно, не могли бы вы рассказать мне о более подходящем способе сортировки?


person Ahmad_Hamdan    schedule 18.06.2012    source источник
comment
Не вижу причин не использовать это выражение.   -  person mfussenegger    schedule 18.06.2012
comment
интерфейс, который вы предоставляете, больше используется для предложения Where, а не для Sorting. Выражение сортировки должно быть таким: Expression‹Func‹TEntity, TKey›› keySelector, bool asc ...   -  person Nicolae Dascalu    schedule 18.06.2012
comment
Я уже принял во внимание bool asc, параметр orderby (KeySelection) используется для упорядочения, в настоящее время я пытаюсь использовать класс выражений для создания параметра orderby из строкового.   -  person Ahmad_Hamdan    schedule 18.06.2012
comment
Dynamic Linq уже делает этот порядок построения из строки. Исходники также доступны.   -  person mfussenegger    schedule 19.06.2012


Ответы (1)


Вместо получения Expression<Func<T, bool>> ваша служба может получить Func<IQueryable<T>, IQueryable<T>>, который является более гибким (включает любой LINQ, а не только где) и не требует дополнительной работы, которую выполняют выражения.

Если вы хотите предотвратить неправильное использование (например, внедрение кода), вместо этого передайте перечисление (или строку) (содержащее параметр sortby) службе, и ваша служба создаст запрос соответствующим образом.

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

person Danny Varod    schedule 18.06.2012
comment
Я изменю код своего сервисного уровня, чтобы принять строку или перечисление для порядка с помощью класса Expression и через класс Expression. Я буду строить порядок по предикату, что касается пользовательского интерфейса. Да, я имею в виду контроллер, поскольку я пока буду использовать ASP. .Чистый МВК - person Ahmad_Hamdan; 19.06.2012