首页 > 解决方案 > 如何判断一个表达式树是否是另一个表达式树的子集

问题描述

假设我有

int id1 = 1;
int id2 = 2;
IQueryable<T> source = someSource;
IQueryable<T> predicate1 = source.Where(x => x.id1 = id1);
IQueryable<T> predicate2 = source.Where(x => x.id1 = id1 && x.id2 = id2);

如果 predicate1 的所有动作都在 predicate2 中完成,是否有一种简单的方法可以查明?喜欢predicate1.isChildOf(predicate2) = true and predicate2.isChildOf(predicate1) = false

我想查询数据库并将结果保存在内存中。鉴于我已经做了一个没有太严格约束的查询,我可以查询它而不是数据库。

编辑: 在新查询时,我只有以前的数据集和相应的谓词。假设 (d(ata)1, p(redicate)1), (d2, p2)。我更喜欢从这些数据集而不是数据库中获取数据(成本较低),但有些谓词限制太多,因此我需要查询原始数据库。给定一个新的谓词 p3,我需要确定 d1 或 d2 是否没有“过滤太多”。例如,我们有与原始帖子中相同的谓词和p3 = source.Where(x => x.id3 == id3). 然后我无论如何都需要查询原始数据库。但如果我有,p4 = source.Where(x => x.id1 = id1)那么我可以简单地服用 d1。

标签: c#linqiqueryable

解决方案


一般来说,确定两个函数在给定相同输入的情况下是否产生相同的值(定义为这些函数是“等效的”)是不可能的。因此,从一开始,您就无法按照您的要求解决问题。您可以针对某些特定情况解决它,例如,如前所述,如果两个表达式的引用相等,那么我们知道它们将是等价的,但是您提出的任何解决方案都会有误报或误报。

即使试图提出一些启发式方法,在引用相等性之外,对于非常简单的函数等价的情况是非常困难的,因为有很多方法可以展示即使是最轻微的差异的程序也可能有不同的行为,至少在某些边缘条件下。

试图确定一个函数的理论输出值是否总是另一个函数的子集,使用除了分析一个方法的返回类型是否相等或另一个方法的子类型之外的任何方法,将更加困难


推荐阅读