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

Я хотел бы знать, каков наилучший способ создания динамических запросов с инфраструктурой сущностей и 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?
  • Понимание .AsEnumerable () в LINQ to SQL
  • Выберите синтаксический анализ int, если строка была подвержена анализу int
  • Найти символ с большинством вхождений в строку с C #?
  • LINQ Между оператором
  • Имитация кросс-контекстных объединений - LINQ / C #
  • Как выполнить подзапрос в LINQ?
  • Легкий способ преобразования словаря в xml и наоборот
  • C # Сортировка коллекции, которая позволяет дублировать ключи
  • Используя LINQ для поиска элемента в списке, но получите «Значение не может быть нулевым. Имя параметра: источник "
  • Как найти Список имеет повторяющиеся значения в List
  • Давайте будем гением компьютера.