假设有两个等价的查询,如下所示
var q1 = from x in list select x;
var q2 = from x in list where 1 > 0 select x;
有可能证明它们产生相同的结果集吗?
例如,是否可以实现像这样的方法
static bool AreEqual<T>(IQueryable<T> q1, IQueryable<T> q2) { .. }
使用底层表达式树等等?
(我的现实情况是一个巨大而复杂的查询,我试图在不破坏的情况下进行重构)
发布于 2018-06-01 07:25:05
答案是否定的,特别是对于Linq-To-SQL。
您可以深入到比较sql语句的级别,但是生成的SQL可能会以不同的方式表达相同的基本查询。
你唯一能做的就是写测试用例。
发布于 2018-06-01 17:02:54
您可以尝试这样做:
var result= q1.Equals(q2);
发布于 2018-06-01 17:13:58
不是通过比较查询本身,不是。因为以不同的方式编写相同的查询将导致不同的表达式树和结果SQL。
您需要做的是运行旧的查询并将结果集存储在列表中。然后运行第二个查询并将结果存储在列表中。然后,您必须比较这两个列表,看看它们是否相同。
这样的东西对你来说应该是有效的:
var dif = result1.Except(result2).Count() == 0 && result2.Except(result1).Count() == 0;
如果dif为False,则两个集合是不同的。我们必须排除这两种方法,否则如果结果2比result1长,你会得到一个错误的匹配。
https://stackoverflow.com/questions/50634004
复制相似问题