Linq - Как совместить отражение с где и содержит - PullRequest
1 голос
/ 09 января 2020

Я хочу создать динамический метод c для выбора данных с помощью contains в предложении where. Я нашел много информации о выражениях, но не могу найти комбинацию, которая работает.

Я опубликовал свой метод и застрял в этой строке, выполняя поиск решения с помощью рефлексии или чего-то подобного:

.Where (p => p.Description! = Null && p.Description.ToLower (). Contains (lowerFilter));

Что является наилучшей практикой при решении проблема?

Метод выбора:

public List<TEntity> GetItems(string sortBy, string sort, string? filter)
{
    IQueryable<TEntity> items = dbContext.Set<TEntity>();

    if (filter != null && filter.Length > 0)
    {
        string lowerFilter = filter.ToLower(CultureInfo.CurrentCulture);

        items = items
            .Where(p => p.Description != null && p.Description.ToLower().Contains(lowerFilter));
    }

    if (!string.IsNullOrEmpty(sortBy))
    {
        if (!string.IsNullOrEmpty(sort))
        {
            items = items.AsQueryable().OrderBy($"{sortBy} {sort}");
        }
    }

    List<TEntity> itemsList = items.ToList();

    return itemsList;
}

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Вы можете сделать это с помощью Dynami c Expression Builder :

Этот общий метод расширения c помогает реализовать Contains для всех IQueryable:

public static IQueryable<T> ContainsByField<T>(this IQueryable<T> q, string field, string value)
{
    var eParam = Expression.Parameter(typeof(T), "e");
    var method = field.GetType().GetMethod("Contains");
    var call = Expression.Call(Expression.Property(eParam, field), method, Expression.Constant(value.ToLower()));
    var lambdaExpression = Expression.Lambda<Func<T, bool>>(
        Expression.AndAlso(
            Expression.NotEqual(Expression.Property(eParam, field), Expression.Constant(null)),
            call
        ),
        eParam
    );

    return q.Where(lambdaExpression);
}

Тогда вам нужно позвонить так просто:

items = items.ContainsByField("Description", lowerFilter);
0 голосов
/ 09 января 2020

Ваш запрос linq должен работать просто отлично.

.Where(p => p.Description != null && p.Description.ToLower().Contains(lowerFilter));

С точки зрения передового опыта, единственное, что я сейчас вижу, это ненужный вложенный оператор if. Что вы можете упростить как:

 if (!string.IsNullOrEmpty(sortBy) && !string.IsNullOrEmpty(sort))
    {
        items = items.AsQueryable().OrderBy($"{sortBy} {sort}");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...