Создание динамических запросов с инфраструктурой сущностей

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

Я хочу создать службу, которая имеет множество параметров для сортировки и фильтрации (более 50). Я получаю объект от gui, где они будут заполнены … и запрос будет выполнен из одного метода службы.

Я огляделся и увидел, что могу динамически создать строку, которая может быть выполнена в конце моего метода. Мне это не очень нравится. Есть лучший способ сделать это? Предпочтительно безопасный тип с проверкой компиляции?

Вы можете составлять IQueryable шаг за шагом. Предполагая, что у вас есть class FilterDefinition который описывает, как пользователь хочет фильтровать …

 public class FilterDefinition { public bool FilterByName { get; set; } public string NameFrom { get; set; } public string NameTo { get; set; } public bool FilterByQuantity { get; set; } public double QuantityFrom { get; set; } public double QuantityTo { get; set; } } 

… тогда вы можете построить такой запрос:

 public IQueryable GetQuery(FilterDefinition filter) { IQueryable query = context.Set(); // assuming that you return all records when nothing is specified in the filter if (filter.FilterByName) query = query.Where(t => t.Name >= filter.NameFrom && t.Name <= filter.NameTo); if (filter.FilterByQuantity) query = query.Where(t => t.Quantity >= filter.QuantityFrom && t.Quantity <= filter.QuantityTo); return query; } 

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

  public List Get(FilterValues filter) { using (var context = new AdventureWorksEntities()) { IQueryable query = context.Contacts.Where(c => c.ModifiedDate > DateTime.Now); if (!string.IsNullOrEmpty(filter.FirstName)) { query = query.Where(c => c.FirstName == filter.FirstName); } if (!string.IsNullOrEmpty(filter.LastName)) { query = query.Where(c => c.LastName == filter.LastName); } return query.ToList(); } } 

Я создал общий repository, который должен вам помочь. Он поддерживает единый API для запроса и сортировки как по известным, так и по динамическим полям:

  //Filter on known fields var keyboard = Query.Create(p=>p.Category=="Keyboard"); var keyboards = repository.Get(keyboard); //Or filter on dynamic fields var filter = Query.Create("Rating", OperationType.GreaterThan, 4) var filteredKeyboards = repository.Get(filter); //You can also combine two queries togather var filterdKeyboards2 = repository.Get(keyboard.And(filter)) //Order it on known fields var orderedKeyboard = keyboard.OrderBy(o=>o.Asc(p=>p.Name)); var orderedKeyboards = repository.Get(orderedKeyboard); //Or order by on dynamic fields var userOrdering = keyboard.OrderBy(o=>o.Asc("Name")); var orderedKeyboards2 = repository.Get(userOrdering); 

Я не знаю об объекте поиска / DTO, который вы получаете, но вы можете легко создать общий объект поиска / DTO и можете сопоставить его с объектом Query в нескольких строках кода. Я использовал его в прошлом вокруг службы WCF, и он работал очень хорошо для меня.

Вы можете изучить создание службы с использованием служб данных WCF и динамическое создание URI для запроса модели вашего объекта.

  • Сортировка одного списка другим
  • Возвратный список с использованием выбора нового в LINQ
  • Как получить индекс элемента в IEnumerable?
  • Когда использовать функции Cast () и Oftype () в Linq
  • Возможна ли инъекция через динамический LINQ?
  • Linq-to-entities - метод Include () не загружается
  • Состав и группа LINQ по периодам времени
  • Чтение файла по строке в C #
  • LINQ, Невозможно создать постоянное значение типа XXX. В этом контексте поддерживаются только примитивные типы или типы перечислений
  • Как преобразовать список массивов в multidimensional array
  • Разница между Select и SelectMany
  • Interesting Posts

    Вторичный монитор не будет отображаться в полном разрешении, если основной дисплей отключен

    Использование в качестве конкретного типа, соответствующего протоколу AnyObject, не поддерживается

    Как отключить «Сканирование защиты от сканирования» нового Chrome-17?

    Возможно ли как-то скрыть Growl и Herald, когда VLC работает в полноэкранном режиме?

    Почему я должен устанавливать драйверы оборудования, если мой компьютер работает нормально?

    Как получить список файлов с определенным расширением в данной папке?

    Как вы отформатируете SD-карту на 2 ГБ на FAT32 (желательно с дисковой утилитой)?

    Как расширить все столбцы в электронной таблице Excel?

    Как получить координаты экрана с маркера в google maps v2 android

    Вращение журнала Ruby on Rails

    PLSQL JDBC: как получить идентификатор последней строки?

    Преобразование долготы / широты в координату X / Y

    Компьютер не может распознать USB-флэш-диск

    В чем преимущество load () vs get () в Hibernate?

    Изменить версию сборки в сборке .NET-сборки

    Давайте будем гением компьютера.