【发布时间】:2020-02-04 19:46:47
【问题描述】:
我想组合一些分离的 lambda 表达式并构建它们的最终表达式。
示例类:
class Address {
public string city { get; set; }
public string country { get; set; }
}
class ClassA {
public int Id { get; set; }
public Address address { get; set; }
}
class ClassB {
public int Id { get; set; }
public ClassA objectA { get; set; }
}
每个类都有一个 lambda 表达式:
Expression<Func<ClassA,bool>> classARule = a =>
a.Id > 1 && a.address.city == "city1" || a.address.country == "us"
Expression<Func<ClassB,bool>> classBRule = b => b.Id == 100
因为ClassB 具有ClassA 的一个属性,所以可以创建具有这两个条件的表达式。示例:
// I want to create this expected object at runtime using classARule and classBRule
Expression<Func<ClassB,bool>> expected = b =>
(b.Id == 100) &&
(b.objectA.Id > 1 && b.objectA.address.city == "city1" || b.objectA.address.country == "us")
如果我想在运行时生成预期的表达式,我应该以某种方式将 classARule 的 a 参数转换为 b.objectA
问题是我知道如何组合两个表达式,但我不知道如何将a 参数替换为其他对象。在这种情况下b.objectA
更新 - 避免更多混乱
目标是在运行时使用classARule和classBRule实现Expression<Func<ClassB,bool>> expected表达式
【问题讨论】:
-
您是否只想让您的 func 采用 2 个参数而不是 1 个参数?我有点困惑你在问什么
-
@Jonesopolis 不,我想根据类的每个属性动态组合所有规则。
-
这些规则对我的数据库查询应用了一些限制,例如,因为 ObjectB 引用了 ObjectA,我想在运行时将 objectA 限制添加到最终查询中
-
可以在编译时执行此操作并将
a更改为b.objectA属性。像上面的例子。我的问题是我应该如何在运行时做到这一点? -
@Jonesopolis 我写了很多表达式是过去但现在我也很困惑:) 我认为在这种情况下这是正常的。 xD
标签: c# expression lambda