gpt4 book ai didi

c# - 从 BinaryExpression 到 Expression>

转载 作者:可可西里 更新时间:2023-11-01 03:07:50 24 4
gpt4 key购买 nike

假设我有类似的东西

Expression<Func<SomeType, DateTime>> left = x => x.SomeDateProperty;
Expression<Func<SomeType, DateTime>> right = x => dateTimeConstant;
var binaryExpression = Expression.GreaterThan(left, right);
Expression<Func<SomeType, bool>> predicate =
x => x.SomeDateProperty> dateTimeConstant;

1) 如何用 binaryExpression 代替最后一行赋值的右手? var predicate = x => binaryExpression; 不起作用。

2) 右边的总是一个常量,不一定是DateTime.Now。它可以是一些更简单的 Expression 类型吗?例如,它不依赖于 SomeType,它只是一个常量。

3) 如果我将 GreaterThan 作为 string,是否有办法从该字符串获取 Expression< 中具有相同名称的方法?通常,如果比较方法的名称以 string 的形式给出,我如何才能从字符串到实际调用 Expression 类上的同名方法?

如果重要的话,它必须与 LINQ to Entities 一起工作。

最佳答案

1 和 2:您需要手动构建表达式树来执行此操作,编译器无法提供帮助,因为它只构建现成的表达式来完整地表示函数。当您想逐个构建函数时,这没有用。

这是构建所需表达式的一种直接方法:

var argument = Expression.Parameter(typeof(SomeType));
var left = Expression.Property(argument, "SomeDateProperty");
var right = Expression.Constant(DateTime.Now);

var predicate = Expression.Lambda<Func<SomeType, bool>>(
Expression.GreaterThan(left, right),
new[] { argument }
);

你可以用它来试驾

var param = new SomeType { 
SomeDateProperty = DateTime.Now.Add(TimeSpan.FromHours(-1))
};

Console.WriteLine(predicate.Compile()(param)); // "False"

3:由于您的二元谓词的可能选择的数量很可能非常小,您可以使用字典来做到这一点:

var wordToExpression = 
new Dictionary<string, Func<Expression, Expression, BinaryExpression>>
{
{ "GreaterThan", Expression.GreaterThan },
// etc
};

然后,不要在第一个代码段中对 Expression.GreaterThan 进行硬编码,而是执行类似 wordToExpression["GreaterThan"](left, right) 的操作。

当然这也可以通过反射的标准方式来完成。

关于c# - 从 BinaryExpression 到 Expression<Func<T, bool>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16808121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com