Существует ли шаблон, использующий Linq для динамического создания фильтра?
-
09-06-2019 - |
Вопрос
Существует ли шаблон, использующий Linq для динамического создания фильтра?
У меня есть необходимость создать пользовательскую фильтрацию в списке, в прошлом я бы просто динамически создавал SQL...it не похоже, что это возможно с Linq.
Решение
Посмотрите на Динамическая Библиотека Linq из блога СкоттГу:
Например, ниже приводится стандартный тип-безопасный LINQ для SQL-запроса VB, который извлекает данные из базы данных и отображает его в ASP.NET элемент управления GridView:
Dim Northwind As New NorthwindDataContext
Dim query = From q In Northwind.Products Where p.CategoryID = 2 And p.UnitPrice > 3 Order By p.SupplierID Select p
Gridview1.DataSource = query
GridView1.DataBind()
Используя библиотеку LINQ DynamicQuery, я мог бы переписать приведенное выше выражение запроса следующим образом
Dim Northwind As New NorthwindDataContext
Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId")
Gridview1.DataSource = query
GridView1.DataBind()
Обратите внимание, что предложение conditional-where и предложение sort-orderby теперь принимают строковые выражения вместо выражений кода.Поскольку это строки с поздней привязкой, я могу динамически создавать их.Например:Я мог бы предоставить пользовательский интерфейс бизнес-аналитику конечного пользователя, используя мое приложение, которое позволяет им самостоятельно создавать запросы (включая произвольные условные предложения).
Другие советы
Динамический Linq - это один из способов.
Это может быть излишеством для вашего сценария.Рассмотреть:
IQueryable<Customer> query = db.Customers;
if (searchingByName)
{
query = query.Where(c => c.Name.StartsWith(someletters));
}
if (searchingById)
{
query = query.Where(c => c.Id == Id);
}
if (searchingByDonuts)
{
query = query.Where(c => c.Donuts.Any(d => !d.IsEaten));
}
query = query.OrderBy(c => c.Name);
List<Customer> = query.Take(10).ToList();
что-то вроде этого?
var myList = new List<string> { "a","b","c" };
var items = from item in db.Items
where myList.Contains(item.Name)
select item;
это создало бы оператор sql, подобный
SELECT * FROM Items [t0] where Name IN ('a','b','c')