gpt4 book ai didi

c# - 如何组合两个表达式?

转载 作者:太空狗 更新时间:2023-10-29 22:54:35 25 4
gpt4 key购买 nike

我正在尝试构建一个将应用于 IQueryable 集合的表达式。

我可以这样构建一个表达式:

[TestClass]
public class ExpressionTests
{
private IQueryable<MyEntity> entities;

private class MyEntity
{
public string MyProperty { get; set; }
}

[TestInitialize]
public void Setup()
{
entities = new[]
{
new MyEntity {MyProperty = "first"},
new MyEntity {MyProperty = "second"}
}.AsQueryable();
}

[TestMethod]
public void TestQueryingUsingSingleExpression()
{
Expression<Func<MyEntity, bool>> expression = e => e.MyProperty.Contains("irs");
Assert.AreEqual(1, entities.Where(expression).Count());
}
}

现在我想把表达式的两部分分开:

[TestMethod]
public void TestQueryingByCombiningTwoExpressions()
{
Expression<Func<MyEntity, string>> fieldExpression = e => e.MyProperty;
Expression<Func<string, bool>> operatorExpression = e => e.Contains("irs");
// combine the two expressions somehow...
Expression<Func<MyEntity, bool>> combinedExpression = ???;

Assert.AreEqual(1, entities.Where(combinedExpression).Count());
}

关于如何执行此操作有什么建议吗?

顺便说一句,将解析表达式的提供程序是 NHibernate 的 Linq。

最佳答案

看看你的两个表达式树:

                 |                                      |               Lambda                                Lambda              /      \                              /      \             /        \                            /        \     Property          Parameter x               Call        Parameter y    /        \                                  /  |  \   /          \                                /   |   \  x           MyProperty              EndsWidth    y    Constant                                                        |                                                       "5"

您需要创建一个如下所示的新树:

                                 |                               Lambda                              /      \                             /        \                           Call        Parameter z                          /  |  \                         /   |   \                   EndsWith  |   Constant                             |         \                          Property     "5"                         /        \                        /          \                       z          MyProperty

您可以很容易地看到新树的哪些部分来自哪棵原始树。

要创建树,您需要第二个 lambda 表达式(Call)的主体,并将所有出现的 y 替换为第一个 lambda 表达式(Property)的主体和所有出现的 xz。然后将结果包装在一个带有参数 z 的新 lambda 表达式中。

您可以使用 ExpressionVisitor Class重写树,以及 Expression.Lambda Method创建新的 lambda 表达式。

关于c# - 如何组合两个表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6854746/

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