我想创建一个表示EF Core Linq Query Where子句中要使用的条件的表达式树对象. 因为这个条件将在不同的查询中使用,所以我想定义它一次,然后在任何地方使用它. 但是,我也希望以方法的形式使用这个条件,这样我就可以在没有Linq的情况下使用它.

所以我的问题是,我是否可以使用构建表达式树对象的方法?我知道当立即将lambda分配给它时,可以从lambda构建表达式树,但我可以从单独定义的方法创建表达式树吗?我的意思是:

using System.Linq.Expressions;

internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");

        Expression<Func<int, bool>> expressionTree1 = (int x) => x % 2 == 0; // compiles

        var lambda1 = (int x) => x % 2 == 0;

        // following two don't compile with an error:
        //      Expression<Func<int, bool>> does not contain a constructor that takes 1 argument
        var expressionTree2 = new Expression<Func<int, bool>>(lambda1);
        var expressionTree3 = new Expression<Func<int, bool>>(IsEven);
    }

    private static bool IsEven(int x)
    {
        return x % 2 == 0;
    }
}

所以我想以某种方式从其他地方定义的方法构建Expression<Func<int, bool>>,如上面的IsEven.

推荐答案

我认为您不能,因为表达式树只能包含方法可以包含的内容的子集.

用表达式树来声明方法如何,而不是反过来呢?这也应该可以实现只编写一次条件的目标.

static Expression<Func<int, bool>> expressionTree1 = (int x) => x % 2 == 0;

// only need to compile this once
static Func<int, bool> compiledExpressionTree1 = expressionTree1.Compile();

private static void Main(string[] args)
{
    Console.WriteLine(IsEven(1)); // false
}

private static bool IsEven(int x)
{
    return compiledExpressionTree1(x);
}

Csharp相关问答推荐

Plotly.NET访问互联网时出现异常

如何使用C#和Graph API从Azure Directory获取用户详细信息

一种安全的方式来存储SSH凭证(MAUI/C#应用程序)

如果属性名为xyz,我需要使用System.Text.Json修改字符串类型的值""<>

在C#中使用类中的对象值

Blazor EventCallback<;MyType<;T>;>;

如何在C#中从正则表达式中匹配一些数字但排除一些常量(也是数字)

Amazon SP-API确认发货不设置&Quot;递送服务

当用户右键单击文本框并单击粘贴时触发什么事件?

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

N层解决方案上的依赖注入-删除样板

HelperText属性不支持复杂内容(混合C#和标记)

如何从非异步任务中正确返回TypeResult

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

从MudAutoComplete打开对话框,列表仍然可见

在C#/ASP.NET Core 7中,什么可能导致POST请求作为GET请求发送

如何读取TagHelper属性的文本值?

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

Windows 10上埃及标准时间的时区偏移不正确

默认架构不存在EF核心迁移