2011-12-11 5 views
0
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内)IQueryable.FirstOrDefault()とIEnumerable.FirstOrDefaultは()ことが可能であるどのように

リポジトリ

答えて

0

問題は、OrderBy()、OrderBy()、ThenBy()の代わりにOrderByを使用したことでした。だから問題はそこにある。 OrderBy()。ThenBy()にソースコードを変更すると、すべて正常に動作します。

5

EFエンティティで動作!=演算子は参照ではなく、データを比較します。それらは同じ値を返すかもしれませんが、!=は値を比較しません。オブジェクト参照をメモリヒープ(ポインタ)と比較します。

v2クエリでは.ToList()が呼び出されるため、結果のコピーが実際に作成され、別の変数に格納されます。したがって、v2は実行されたクエリの結果を指し、v1は実行可能なクエリを指します。これらは完全に異なるオブジェクトです。

+0

"!=演算子はデータではなく参照を比較します。"この場合、はい。これは、.Equals()をオーバーライドした場合に必ずしも当てはまるとは限りません。 –