Можно ли доказать (программно), что два запроса LINQ равны? - PullRequest
0 голосов
/ 01 июня 2018

Допустим, есть 2 эквивалентных запроса, таких как

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

Можно ли доказать, что они дают одинаковый набор результатов?

Например, можно ли реализовать метод, подобный * 1006?*

static bool AreEqual<T>(IQueryable<T> q1, IQueryable<T> q2) { .. }

с использованием нижележащего дерева выражений и т. Д.?

(Моя реальная ситуация - гигантский, сложный запрос, который я пытаюсь реорганизовать без прерывания)

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Вы можете попробовать это:

 var result= q1.Equals(q2);
0 голосов
/ 01 июня 2018

Не сравнивая сами запросы, нет.Потому что написание одного и того же запроса другим способом приведет к различным деревьям выражений и результирующему SQL.

Вам нужно будет выполнить старый запрос и сохранить результирующий набор в списке.Затем выполните второй запрос и сохраните результат в списке.Затем вам нужно будет сравнить два списка и посмотреть, идентичны ли они.

Что-то вроде этого должно работать для вас:

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

Если dif - False, две коллекции различны,Мы должны исключить оба способа, иначе, если результат 2 длиннее, чем результат1, вы получите ложное совпадение.

0 голосов
/ 01 июня 2018

Ответ отрицательный, особенно с Linq-To-SQL.

Вы можете перейти на уровень сравнения операторов sql, но полученный SQL может выразить один и тот же фундаментальный запрос по-разному.

Единственное, что вы можете сделать, это написать контрольные примеры.

...