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

时间:2011-12-11 12:50:10

标签: c# linq entity-framework

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 ENTITIES DIFFERENT 怎么可能? (db中的数据相同)

存储库使用EF实体运行

2 个答案:

答案 0 :(得分:5)

!=运算符比较引用,而不是数据。它们可能返回相同的值,但是!=不比较值,它将对象引用与内存堆(指针)进行比较。

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

答案 1 :(得分:0)

问题在于它使用OrderBy()。OrderBy而不是OrderBy()。ThenBy()。所以存在问题。如果将源代码更改为OrderBy()。ThenBy()则所有工作都正确。