2014-10-29 4 views
0

У меня есть проект, в котором у меня есть динамически построенные DataGrids (winform), которые генерируются в соответствии с некоторой конфигурацией внутри некоторых XML-файлов в каталоге. Фактически, для каждого DataGrid имеется один xml (файл имеет то же имя DataGrid), и этот xml содержит информацию о столбцах DataGrid и таблице базы данных, на которую должна быть привязана сетка.C# LinqToSql build dynamic where where

С той же информацией, приведенной выше, создается панель (для каждой сетки) и содержит поля, необходимые для фильтрации каждого столбца.

В настоящее время я применил к моему проекту, например, описанный в этой ссылке: http://www.codeproject.com/Tips/582450/Build-Where-Clause-Dynamically-in-Linq

динамически фильтровать свою таблицу, используя динамический где (LINQ) положение на столе источника данных (DataSource просто выбрать во всем базовая таблица).

То, что я бы достиг, это оптимизация, потому что, если есть много данных, извлечение db может быть дорогостоящим. Итак, я бы построил динамический linq для sql where вместо вместо динамического запроса linq по списку со всей табличной записью.

Как я могу это сделать?

Заранее спасибо.

+1

Возможный дубликат [Динамически генерировать запросы LINQ] (http://stackoverflow.com/questions/9505189/dynamically-generate-linq-queries) –

+0

Ссылка, на которую вы ссылаетесь, уже генерирует выражение, которое может быть применено к 'DbSet' или L2S' Table', используя '.Where (выражение)'. Почему вы не можете применить его непосредственно к базе данных вместо источника данных? – Maarten

+0

Если вы используете Linq2Sql, тогда ваш запрос возвращает объект IQueryable (что для простоты просто оболочка вокруг SqlCommand). Если вы примените приложение Where к IQueryable, которое будет транслироваться в инструкцию WHERE Sql. Это, кажется, решает вашу проблему, или, может быть, я не понял вашу озабоченность в первую очередь. – Sphaso

ответ

0

1) По цепочке: взгляните на this answer. Он содержит некоторые отличные методы расширения для предикатов. Полный код там, без использования дублирования. Пример: модель Northwind с классом Employee. Последний фильтр будет содержать сотрудников из региона Сиэттл или WA и будет иметь идентификатор больше 10. Релевантный здесь выполняется только базовый запрос удаленно (a SELECT * FROM Employees), Фильтрация LINQ to SQL выполняется в локальном кэше.

Predicate<Employee> p1 = emp => emp.City == "Seattle"; 
Predicate<Employee> p2 = emp => emp.Region == "WA"; 
Predicate<Employee> p3 = emp => emp.EmployeeID > 10; 
Predicate<Employee> orp1p1Andp3 = PredicateExtensions.OrAll(new[] { p1, p2}).And(p3); 
//identical with 
Predicate<Employee> orp1p1Andp3 = p1.Or(p2).And(p3); 
// 
var query = from emp in this.ctx.Employees select emp; 
Func<Employee,bool> selector = emp=>orp1p1Andp3(emp); 
dataGrid.ItemsSource = query.Where(selector); 

2) На исполнении: Имхо, это отключенный против связной парадигмы (DataSet против DataReader) существующей с ADO.NET. Вы должны измерить влияние remote vs local query execution и compiled queries (кстати, динамическая фильтрация, которую вы так увлекаете, будет уменьшена до Enumerable.Union и Enumerable.Intersect операций для скомпилированных запросов). Бенчмаркинг покажет вам наиболее подходящее решение для вашей среды.

Смежные вопросы