IQueryable.FirstOrDefault()和IEnumerable.FirstOrDefault()返回不同

本文关键字:FirstOrDefault 返回 IQueryable IEnumerable | 更新日期: 2023-09-27 18:17:24

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 != v2ENTITIES DIFFERENT这怎么可能?(db内数据相同)

存储库操作EF实体

IQueryable.FirstOrDefault()和IEnumerable.FirstOrDefault()返回不同

!=操作符比较的是引用,而不是数据。它们可能返回相同的值,但是!=不比较值,它比较对象引用到内存堆(指针)。

由于您的v2查询调用. tolist(),它实际上是创建结果的副本并将它们放在不同的变量中。因此,v2指向已执行查询的结果,而v1指向可执行查询。

问题是它使用了OrderBy()。而不是OrderBy(). thenby()。问题就在这里。如果将源代码更改为OrderBy(). thenby(),则所有工作都正确