是否有可能(以编程方式)证明两个LINQ查询是相等的?

时间:2018-05-31 23:06:47

标签: c# sql linq expression-trees

假设有2个等效查询,例如

var q1 = from x in list select x;
var q2 = from x in list where 1 > 0 select x;

是否有可能证明它们产生相同的结果集?

E.g。是否可以实现像

这样的方法
static bool AreEqual<T>(IQueryable<T> q1, IQueryable<T> q2) { .. }

使用底层表达式树等等?

(我的现实情况是一个巨大的,复杂的查询,我试图重构而不会破坏)

3 个答案:

答案 0 :(得分:5)

答案是否定的,尤其是Linq-To-SQL。

您可以深入到比较sql语句的级别,但生成的SQL可能以不同的方式表达相同的基本查询。

你唯一能做的就是编写测试用例。

答案 1 :(得分:0)

你可以试试这个:

 var result= q1.Equals(q2);

答案 2 :(得分:0)

不是通过比较查询本身,不是。因为以不同的方式编写相同的查询将导致不同的表达式树和结果SQL。

您需要做的是运行旧查询并将结果集存储在List中。然后运行第二个查询并将结果存储在List中。然后,您必须比较两个列表,看看它们是否相同。

这样的事情对你有用:

var dif = result1.Except(result2).Count() == 0 && result2.Except(result1).Count() == 0;

如果dif为假,则两个集合不同。我们必须除了两种方式,否则如果结果2比result1长,你就会得到错误的匹配。