Применение выражения <> к предложению LINQ Where - PullRequest
0 голосов
/ 13 июля 2020

Я пишу собственный фильтр Entity Framework. У меня есть список идентификаторов и пользовательское выражение.

protected IEnumerable<TColumn> FilterIds;
protected Expression<Func<T, IEnumerable<TColumn>, bool>> Filter;

Теперь мой вопрос: как применить выражение Filter к предложению Where()?

public virtual IQueryable<T> ApplyFilter(IQueryable<T> query)
{
    if (FilterMode == FilterModeMatchAny && HasFilterIds)
    {
        // Whoops! Can't do this!
        return query.Where(x => Filter(x, FilterIds));
    }
    return query;

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете создать новое выражение для вызова Filter с помощью FilterIds и использовать Expand из LinqKit

Edit Благодаря @ Servy комментарий. Теперь я раскрываю только внутреннее выражение вместо всего запроса.

...
protected IEnumerable<TColumn> FilterIds;
protected Expression<Func<T, IEnumerable<TColumn>, bool>> Filter;

public virtual IQueryable<T> ApplyFilter(IQueryable<T> query)
{
    if (FilterMode == FilterModeMatchAny && HasFilterIds)
    {
        Expression<Func<T, bool>> expression = x => Filter.Invoke(x, FilterIds);
        return query.Where(expression.Expand());
    }
    return query;
}
...
1 голос
/ 13 июля 2020

Используя метод Combine из этого сообщения делает почти все, что вам нужно. Оттуда вам просто нужно превратить буквальное значение в выражение, которое его вычисляет (или, я думаю, изменить метод Combine из этого ответа, чтобы промежуточное значение не вычислялось из лямбда, а было просто любым выражением) и затем вызовите функцию.

protected IEnumerable<TColumn> FilterIds;
protected Expression<Func<T, IEnumerable<TColumn>> FilterIdsExpression => _ => FilterIds;
protected Expression<Func<T, IEnumerable<TColumn>, bool>> Filter;

public virtual IQueryable<T> ApplyFilter(IQueryable<T> query)
{
    if (FilterMode == FilterModeMatchAny && HasFilterIds)
    {
        return query.Where(FilterIdsExpression.Combine(Filter));
    }
    return query;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...