2012-06-18 2 views
0

У меня есть несколько классов, которые реализуют общий интерфейс хранилища, один из методов в этих классах является метод, который возвращает Paged результат и занимаетСортировка в EF с Repository и Service Layer

Expression<Func<T, bool>> OrderBy 

Я также создал слой службы, который будет использовать классы репозитория, поскольку я прочитал, что не рекомендуется отправлять объект Expression из UI To Service Layer, поэтому я решил отправить его как параметр, если я отправлю его как строку, которая содержит имя параметра, как я могу преобразовать строку как свойство, которое будет использоваться в объекте Expression, например, предположим, что у меня есть Entity, называемый User, и я посылаю методу параметр под названием «UserName», как я могу конвертировать "UserName" - поворот d в свойство «UserName», которое может использоваться в объекте Expression> OrderBy?

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

+0

Я не вижу причин не использовать выражение. – mfussenegger

+0

интерфейс, который вы предоставляете, больше используется для предложения Where, а не для сортировки. Выражение сортировки должно быть таким: Expression > keySelector, bool asc ... –

+0

Я уже принял во внимание bool asc, orderby paramter (KeySelection) - это тот, который используется для заказа, я в настоящее время пытаясь использовать класс выражения для создания параметра orderby из строкового. –

ответ

0

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

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

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

+0

Я изменю код уровня сервиса, чтобы принять строку или перечисление для порядка через класс Expression. Я буду строить порядок по предикату, так как для пользовательского интерфейса да, я имею в виду контроллер, поскольку я пока что буду идти с ASP.Net MVC –

Смежные вопросы