1 | ||||||
Гибкая фильтрация данных запроса13.02.2015, 14:21. Показов 1848. Ответов 14
Требуется сделать фильтр таблицы. Фильтр большой около 15 различных типов полей (string, datetime, boolean). Как сделать подобный фильтр более гибким??? То есть если поле не задано пользователем (не вводились данные) то не включать его в запрос where.
Примерно вот так делаю:
0
|
13.02.2015, 14:21 | |
Ответы с готовыми решениями:
14
Фильтрация данных Фильтрация данных Гибкая последовательная сортировка Фильтрация данных из БД Access |
2151 / 1288 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
13.02.2015, 14:26 | 2 |
сделать столько Funcoв (предикатов) сколько есть фильтров
потом сформировать один итоговый Func в котором будут использоваться только те фильтры которые выбраны и этот итоговый предикат пихать в linq to ef
0
|
2151 / 1288 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
||||||
13.02.2015, 15:28 | 4 | |||||
Сообщение было отмечено Trukhanov_VP как решение
Решение
Trukhanov_VP, вот пример на пальцах
2
|
Master of Orion
|
|||||||||||
13.02.2015, 16:42 | 5 | ||||||||||
Скину код с прода, надеюсь, никто возражать у меня не будет (тем более, что писал я)
1
|
Master of Orion
|
||||||
16.02.2015, 10:09 | 8 | |||||
Trukhanov_VP, да, кстати, надеюсь вы не подумали, что я всё для этих свойств расписывал руками, конечно же, это сгенерированный кусок кода
3
|
Master of Orion
|
||||||
16.02.2015, 13:16 | 10 | |||||
sigmov, Да это не секрет, гуглите по T4 template Например
Добавлено через 40 минут Очень мощная штука. В моем случае вот ЭТО Кликните здесь для просмотра всего текста
<#@ template language="C#" #>
<#@ output extension=".cs" #> <#@ assembly name="System.Core" #> <#@ assembly name="System.Reflection" #> <#@ assembly name="$(TargetDir)$(TargetFileName)" #>using System; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Web.UI.WebControls; using Lanit.Audit.Models; <#var props = typeof (Lanit.Audit.Models.AuditEntry).GetProperties(System.Reflection.BindingFlags.Ins tance | System.Reflection.BindingFlags.Public); #> public static class AuditHelper { public static IOrderedEnumerable<AuditEntry> OrderBy(this IEnumerable<AuditEntry> collection, string property) { switch(property) { <# foreach (var prop in props) { #>case "<#=prop.Name#>": return collection.OrderBy(x=>x.<#=prop.Name#>); <# } #>} throw new NotImplementedException(); } public static IOrderedEnumerable<AuditEntry> OrderByDescending(this IEnumerable<AuditEntry> collection, string property) { switch(property) { <# foreach (var prop in props) { #>case "<#=prop.Name#>": return collection.OrderByDescending(x=>x.<#=prop.Name#>); <# } #>} throw new NotImplementedException(); } public static IOrderedEnumerable<AuditEntry> OrderBy(this IEnumerable<AuditEntry> collection, string property, SortDirection directon) { return directon == SortDirection.Ascending ? collection.OrderBy(property) : collection.OrderByDescending(property); } public static IComparer<AuditEntry> GetComparer(string property, SortDirection directon) { switch(property) { <#foreach (var prop in props) { #>case "<#=prop.Name#>": return directon == SortDirection.Ascending ? (IComparer<AuditEntry>) new <#=prop.Name#>Comparer() : new <#=prop.Name#>ComparerDescendant(); <# } #>} throw new NotImplementedException(); } public static bool RegexIsMatch(this AuditEntry entry, string pattern, string property) { var regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); switch(property) { <# foreach (var prop in props) { #>case "<#=prop.Name#>": return regex.IsMatch(entry.<#= prop.Name + (prop.PropertyType == typeof (string) ? "" : ".ToString()")#>); <# } #>} throw new NotImplementedException(); } public static IEnumerable<AuditEntry> WhereRegexIsMatch(this IEnumerable<AuditEntry> collection, string pattern, string property) { var regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); switch(property) { <# foreach (var prop in props) { #>case "<#=prop.Name#>": return collection.Where(x => regex.IsMatch(x.<#= prop.Name + (prop.PropertyType == typeof (string) ? "" : ".ToString()")#>)); <# } #>} throw new NotImplementedException(); } } <# foreach (var prop in props) { #> public class <#=prop.Name#>Comparer : IComparer<AuditEntry> { public int Compare(AuditEntry x, AuditEntry y) { return x.<#=prop.Name#>.CompareTo(y.<#=prop.Name#>); } } public class <#=prop.Name#>ComparerDescendant : IComparer<AuditEntry> { public int Compare(AuditEntry x, AuditEntry y) { return y.<#=prop.Name#>.CompareTo(x.<#=prop.Name#>); } } <# } #> превращается в Кликните здесь для просмотра всего текста
Мне норм
1
|
16.02.2015, 13:59 [ТС] | 11 | ||||||||||
Psilon, я сделал все проще. Почитал тут тему и воспользовавшись примером Metall_Version написал так:
0
|
burning1ife
|
|
16.02.2015, 14:04 | 12 |
Я еще использую Code Templates из Resharper'a
0
|
Master of Orion
|
|
16.02.2015, 14:11 | 13 |
kenny69, это скорее как сниппеты удобно. А тут нативная поддержка студии, да и компилится оно один раз и до переделки, причем автоматом. Сниппеты удобно, когда пишешь inpc, а он тебе реализует полностью INotifyPropertyChanged автоматом. Короче, разные цели
Trukhanov_VP, боюсь представить производительность этого чуда.
0
|
16.02.2015, 15:22 [ТС] | 15 |
0
|
16.02.2015, 15:22 | |
16.02.2015, 15:22 | |
Помогаю со студенческими работами здесь
15
Фильтрация выводимых в datagridview данных Динамичная фильтрация данных из списка Фильтрация данных в зависимости от выбора в ComboBox Фильтрация данных через BindingSource.Filter Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |