Есть ли шаблон, использующий Linq для динамического создания фильтра? - PullRequest
21 голосов
/ 27 августа 2008

Существует ли шаблон, использующий Linq для динамического создания фильтра?

У меня есть необходимость создать пользовательскую фильтрацию списка, в прошлом я просто динамически создавал SQL ... не похоже, что это возможно с Linq.

Ответы [ 4 ]

19 голосов
/ 27 августа 2008

Ознакомьтесь с Динамической библиотекой Linq из блога ScottGu:

Например, ниже приведен стандартный безопасный для типов запрос LINQ to SQL VB, который получает данные из базы данных Northwind и отображает их в элементе управления 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()

Обратите внимание на то, как условия условного-где и предложения-сортировки теперь принимают строковые выражения вместо выражений кода. Поскольку они являются строками с поздней привязкой, я могу их динамически построить. Например: я мог бы предоставить пользовательский интерфейс для бизнес-аналитика конечного пользователя, используя мое приложение, которое позволяет им самостоятельно создавать запросы (включая произвольные условные предложения).

9 голосов
/ 27 октября 2008

Динамический Линк - один из способов.

Это может быть излишним для вашего сценария. Рассмотрим:

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();
5 голосов
/ 27 августа 2008
2 голосов
/ 27 августа 2008

как то так?

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...