IQueryable.FirstOrDefault () и IEnumerable.FirstOrDefault () возвращают разные значения - PullRequest
0 голосов
/ 11 декабря 2011
var v1 = _questionRepository.GetQuery().Where(q =>
                    q.EvaluationGroupId == evaluationGroupId &&
                    ((q.TopicValue == questionTopic &&
                    q.Index > currentQuestionIndex) ||
                     (q.TopicValue > (questionTopic) &&
                     q.Index >= 0 && q.Id != currentQuestionIndex)))
                     .OrderBy(q => q.Index).OrderBy(a => a.TopicValue).FirstOrDefault();

   var v2 = _questionRepository.GetQuery().Where(q =>
                    q.EvaluationGroupId == evaluationGroupId &&
                    ((q.TopicValue == questionTopic &&
                    q.Index > currentQuestionIndex) ||
                     (q.TopicValue > (questionTopic) &&
                     q.Index >= 0 && q.Id != currentQuestionIndex)))
                     .OrderBy(q => q.Index).OrderBy(a => a.TopicValue).ToList().FirstOrDefault()

v1 ! = v2 РАЗЛИЧНЫЕ ЛИЦА Как это возможно? (Данные в дб одинаковые)

хранилище работает с объектами EF

Ответы [ 2 ]

5 голосов
/ 11 декабря 2011

Оператор! = Сравнивает ссылки, а не данные.Они могут возвращать одинаковые значения, но! = Не сравнивает значения, он сравнивает ссылки на объекты с кучей памяти (указателями).

Поскольку ваш запрос v2 вызывает .ToList (), он фактически создает копиюрезультатов и положить их в другую переменную.Следовательно, v2 указывает на результаты выполненного запроса, тогда как v1 указывает на исполняемый запрос.Это совершенно разные объекты.

0 голосов
/ 13 января 2012

проблема заключалась в том, что он использовал OrderBy (). OrderBy вместо OrderBy (). ThenBy ().Так что проблема есть.если изменить исходный код на OrderBy (). ThenBy (), тогда все работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...