【问题标题】:Get lambda expression from where clause or IQueryable/IEnumerable从 where 子句或 IQueryable/IEnumerable 获取 lambda 表达式
【发布时间】:2020-01-11 03:23:24
【问题描述】:

有没有办法从已知的 where 子句中获取表达式,然后将其传递给其他 Where(<expression>) 子句?

我正在使用 .NET Core 3.0 预览版和 EF Core 预览版。

包括linq和linq动态

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);
}

【问题讨论】:

    标签: c# linq lambda iqueryable .net-core-3.0


    【解决方案1】:

    只需将 lambda 保存在函数变量中并重用它:

    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”是您的项目的实际类型。

    【讨论】:

    • 当心! Func&lt;"itemType", bool&gt; exp 这不是表达式。这会将整个表加载到内存中,然后应用 Where 过滤器!您需要使用Expression&lt;Func&lt;"itemType", bool&gt;&gt; exp 来获取发送到服务器的真正的 sql 过滤语句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2017-10-10
    相关资源
    最近更新 更多