Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Создать Linq выражение на основе параметров  [new]
Lessyp
Member

Откуда:
Сообщений: 122
Предположим есть класс

Customer
{
public string Name
public string Surname
public string Address
}

Должен производится поиск по выбранным (пользователем) полям и методом. Т.е. скажем будет коллекция обьектов:

Filter
{
public string Field
public string Method
public string Value
}

Теперь надо как-то замаппить классы фильтра на собственно Linq


List<Filter> filters = new List<Filter>();
filters.Add(new Filter(){Field = "Name", Method = "Contains", Value = "abc"}) 
filters.Add(new Filter(){Field = "Address", Method = "StartsWith", Value = "Ulitsa Lenina"}) 

using (db = new DBContext())
{
  IQuerable query = db.Customer.Where(...);

  foreach(Filter filter in filters)
  {
   query = query.Where(AddFilterToLinq(filter));
  }

return query.ToList();
}

private Func AddFilterToLinq(Filter filter)
{
}

Можно-ли это каким-то образом реализовать без тотального перебора каждого поля с каждым возможным методом?
18 июн 18, 12:15    [21499393]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26531
Lessyp,

дык Expression
18 июн 18, 12:27    [21499457]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26531
Lessyp,

погуглите "шаблон проектирования спецификация в C#"
18 июн 18, 12:36    [21499479]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
Lessyp
Member

Откуда:
Сообщений: 122
skyANA
дык Expression

я в курсе про них, как конкретно они мне тут помогут без полного перебора каждого поля с каждым оператором? Напишите тогда реализацию метода AddFilterToLinq для коллекции из двух филтров, где Name.Contains("abc") и Address.StartsWith("Ulitsa Lenina")
18 июн 18, 13:27    [21499632]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26531
Lessyp
Напишите тогда реализацию метода AddFilterToLinq для коллекции из двух филтров, где Name.Contains("abc") и Address.StartsWith("Ulitsa Lenina")

Именно AddFilterToLinq? :)

Вообще-то там пяток интерфейсов по хорошему надо реализовать, в том числе и
using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace SomeDomainModel
{
    /// <summary>
    /// Интерфейс для построения дерева условного выражения.
    /// </summary>
    /// <typeparam name="T">Тип сущности, для которой строится выражение</typeparam>
    public interface IEntityConditionBuilder<T> where T : IEntity
    {
        IEntityFilterOperator BuildOperator();

        IEntityConditionBuilder<T> And(Func<IEntityConditionBuilder<T>, IEntityConditionBuilder<T>> conditionExpression);
        IEntityConditionBuilder<T> Or(Func<IEntityConditionBuilder<T>, IEntityConditionBuilder<T>> conditionExpression);
        IEntityConditionBuilder<T> NotAnd(Func<IEntityConditionBuilder<T>, IEntityConditionBuilder<T>> conditionExpression);
        IEntityConditionBuilder<T> NotOr(Func<IEntityConditionBuilder<T>, IEntityConditionBuilder<T>> conditionExpression);
        
        IEntityConditionBuilder<T> Equal<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty value);
        IEntityConditionBuilder<T> NotEqual<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty value);

        IEntityConditionBuilder<T> Null<TProperty>(Expression<Func<T, TProperty>> propertyExpression) where TProperty : class;
        IEntityConditionBuilder<T> NotNull<TProperty>(Expression<Func<T, TProperty>> propertyExpression) where TProperty : class;

        IEntityConditionBuilder<T> Greater<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty value);
        IEntityConditionBuilder<T> GreaterOrEqual<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty value);

        IEntityConditionBuilder<T> Less<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty value);
        IEntityConditionBuilder<T> LessOrEqual<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty value);

        IEntityConditionBuilder<T> Contains<TProperty>(Expression<Func<T, TProperty>> propertyExpression, object value);
        IEntityConditionBuilder<T> NotContains<TProperty>(Expression<Func<T, TProperty>> propertyExpression, object value);

        IEntityConditionBuilder<T> StartsWith(Expression<Func<T, string>> propertyExpression, string value);
        IEntityConditionBuilder<T> EndsWith(Expression<Func<T, string>> propertyExpression, string value);

        IEntityConditionBuilder<T> In<TProperty>(Expression<Func<T, TProperty>> propertyExpression, IEnumerable<TProperty> values);
        IEntityConditionBuilder<T> NotIn<TProperty>(Expression<Func<T, TProperty>> propertyExpression, IEnumerable<TProperty> values);

        IEntityConditionBuilder<T> Between<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty minimum, TProperty maximum);
        IEntityConditionBuilder<T> NotBetween<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty minimum, TProperty maximum);
    }
}
18 июн 18, 13:35    [21499657]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
Lessyp
Member

Откуда:
Сообщений: 122
skyANA
Именно AddFilterToLinq? :)

Вообще-то там пяток интерфейсов по хорошему надо реализовать, в том числе и

не надо интерфейсов, если вы знаете о чем говорите, то написать _реализацию_ указанного метода всего для двух входящих фильтров вам труда не составит ;)
18 июн 18, 13:39    [21499668]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26531
Lessyp
skyANA
Именно AddFilterToLinq? :)

Вообще-то там пяток интерфейсов по хорошему надо реализовать, в том числе и

не надо интерфейсов, если вы знаете о чем говорите, то написать _реализацию_ указанного метода всего для двух входящих фильтров вам труда не составит ;)

Не составит, но позже.
18 июн 18, 13:57    [21499724]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 26531
Вот пока доклад на тему настраиваемых фильтров: Построение уровня доступа к данным с использованием шаблона 'Спецификация' в приложениях на ASP.NET MVC.
18 июн 18, 14:09    [21499770]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
monstrU
Member

Откуда: Москва
Сообщений: 1153
Lessyp,

недавно вспоминал, как динамически собрать условия для Linq выражения.
сделали вот такой PredicateBuilder/
вроде он есть в nuget пакетах.
посмотри может подойдет тебе
18 июн 18, 14:16    [21499792]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3404
Expressions
есть еще вариант более монструозный, подойдет, если нужно сгенерить выражение 1 раз и потом его использовать:
CSharpCodeProvider
18 июн 18, 15:13    [21500073]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
Lessyp
Member

Откуда:
Сообщений: 122
monstrU
недавно вспоминал, как динамически собрать условия для Linq выражения.
сделали вот такой PredicateBuilder/
вроде он есть в nuget пакетах.
посмотри может подойдет тебе

спасибо, посмотрю
19 июн 18, 11:11    [21502390]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
hVostt
Member

Откуда:
Сообщений: 15624
Lessyp
не надо интерфейсов, если вы знаете о чем говорите, то написать _реализацию_ указанного метода всего для двух входящих фильтров вам труда не составит ;)


этих реализаций хоть попой ешь и на гитхабе и в нугетах, и обжёвано пережёвано 500 раз
19 июн 18, 14:36    [21503378]     Ответить | Цитировать Сообщить модератору
 Re: Создать Linq выражение на основе параметров  [new]
StalkerS
Member

Откуда: Nowhere
Сообщений: 1339
Lessyp
Можно-ли это каким-то образом реализовать без тотального перебора каждого поля с каждым возможным методом?

если я правильно понимаю вопрос, то нет. Функция должна соотносится с конкретным полем
24 июн 18, 04:03    [21516134]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить