Получить лямбда-выражение из предложения where или IQueryable / IEnumerable

Есть ли способ получить выражение из известного предложения where, а затем передать его другому предложению Where(<expression>)?

Я использую предварительную версию .NET Core 3.0 с предварительной версией EF Core.

Включены linq и linq dynamic

public void myFunction ()
{
    var expression = GetAllItems()
                       .Where(x => x.Id == 5 && x.Desc.Contains("foos"))
                       .AwesomeGetExpressioneMagicFunction();
    var res = GenericBeforeSaveValidation(expression);
}

public IQueryable<T> GenericBeforeSaveValidation("delegate/expression" exp)
{
     //some generic stuff before 
     return sourceItems.Where(exp);
}

person Max94    schedule 09.09.2019    source источник


Ответы (1)


Просто сохраните лямбду в переменной функции и используйте ее повторно:

public void myFunction ()
{
    Expression<Func<ItemType, bool>> expression = x => x.Id == 5 && x.Desc.Contains("foos");
    var items = GetAllItems()
        .Where(expression)
        .ToList();
    var res = GenericBeforeSaveValidation(expression);
}

public IQueryable<ItemType> GenericBeforeSaveValidation(Expression<Func<ItemType, bool>> exp)
{
     //some generic stuff before 
     return sourceItems.Where(exp);
}

itemType - это фактический тип ваших товаров.

person Elias N    schedule 09.09.2019
comment
остерегаться! Func<"itemType", bool> exp это не выражение. Это загрузит всю таблицу в память, а затем применит фильтр Where! вам нужно использовать Expression<Func<"itemType", bool>> exp, чтобы получить настоящий оператор sql-фильтра, который отправляется на сервер - person Mong Zhu; 09.09.2019