powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создать Linq выражение на основе параметров
13 сообщений из 13, страница 1 из 1
Создать Linq выражение на основе параметров
    #39661919
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположим есть класс

Код: c#
1.
2.
3.
4.
5.
6.
Customer
{
public string Name
public string Surname
public string Address
}


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

Код: c#
1.
2.
3.
4.
5.
6.
Filter
{
public string Field
public string Method
public string Value
}


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


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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)
{
}


Можно-ли это каким-то образом реализовать без тотального перебора каждого поля с каждым возможным методом?
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39661935
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessyp,

дык Expression
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39661939
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessyp,

погуглите "шаблон проектирования спецификация в C#"
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39661969
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAдык Expression
я в курсе про них, как конкретно они мне тут помогут без полного перебора каждого поля с каждым оператором? Напишите тогда реализацию метода AddFilterToLinq для коллекции из двух филтров, где Name.Contains("abc") и Address.StartsWith("Ulitsa Lenina")
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39661973
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypНапишите тогда реализацию метода AddFilterToLinq для коллекции из двух филтров, где Name.Contains("abc") и Address.StartsWith("Ulitsa Lenina")
Именно AddFilterToLinq? :)

Вообще-то там пяток интерфейсов по хорошему надо реализовать, в том числе и
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
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);
    }
}
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39661974
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИменно AddFilterToLinq? :)

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

не надо интерфейсов, если вы знаете о чем говорите, то написать _реализацию_ указанного метода всего для двух входящих фильтров вам труда не составит ;)
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39661985
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypskyANAИменно AddFilterToLinq? :)

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

не надо интерфейсов, если вы знаете о чем говорите, то написать _реализацию_ указанного метода всего для двух входящих фильтров вам труда не составит ;)
Не составит, но позже.
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39661994
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39661997
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessyp,

недавно вспоминал, как динамически собрать условия для Linq выражения.
сделали вот такой PredicateBuilder /
вроде он есть в nuget пакетах.
посмотри может подойдет тебе
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39662036
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Expressions
есть еще вариант более монструозный, подойдет, если нужно сгенерить выражение 1 раз и потом его использовать:
CSharpCodeProvider
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39662331
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUнедавно вспоминал, как динамически собрать условия для Linq выражения.
сделали вот такой PredicateBuilder /
вроде он есть в nuget пакетах.
посмотри может подойдет тебе
спасибо, посмотрю
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39662498
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lessypне надо интерфейсов, если вы знаете о чем говорите, то написать _реализацию_ указанного метода всего для двух входящих фильтров вам труда не составит ;)

этих реализаций хоть попой ешь и на гитхабе и в нугетах, и обжёвано пережёвано 500 раз
...
Рейтинг: 0 / 0
Создать Linq выражение на основе параметров
    #39664769
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypМожно-ли это каким-то образом реализовать без тотального перебора каждого поля с каждым возможным методом?
если я правильно понимаю вопрос, то нет. Функция должна соотносится с конкретным полем
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создать Linq выражение на основе параметров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]