2008-08-27 2 views
21

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

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

ответ

19

Отъезд Dynamic Linq Library из блога ScottGu в:

Например, ниже стандартного типобезопасный LINQ к 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() 

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

+0

Это работает? Я получаю следующее: Ошибка Ошибка перегрузки не удалось, так как доступный «OrderBy» не может быть вызван с этими аргументами: Тип данных (ов) типа (ов) не может быть выведен из этих аргументов. Указание типа (ов) данных явно может исправить эту ошибку. Я не вижу «String» в качестве параметра в предложении .OrderBy. – JohnnyBizzle 2011-05-31 08:11:43

+0

@JohnnyBizzle - Он работает. Я использую его во многих проектах. Дважды проверьте, что dynamic.cs находится в вашем проекте и что вы правильно указали его в своих объявлениях использования. – Geoff 2011-05-31 10:43:15

2

что-то вроде этого?

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') 
9

Dynamic 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(); 
Смежные вопросы