假设有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) { .. }
使用底层表达式树等等?
(我的现实情况是一个巨大的,复杂的查询,我试图重构而不会破坏)
答案 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长,你就会得到错误的匹配。