2012-02-21 7 views
2

データをブール値(IsSuggested)で注文しようとしています。しかし、時々このクエリは20の結果を、時には40になります。私は何が問題か理解しませんでした。その後、注文を変更しました。たとえば、私が "タイトル"で注文するとき、私はこの問題を見ません。私は本当に混乱しています。問題は何ですか?まず、お勧めの取引をするために何ができますか?EF CodefirstとLinq - OrderBy論理値の問題

db.Deal 
    .Include("Store") 
    .Include("Like") 
    .Include("Comment") 
    .OrderByDescending(d => d.IsRecommend) 
    .Skip((syf - 1) * 20) 
    .Take(20) 
    .ToList() 
+0

私の解決策でしたか? – Eranga

+0

はい、クエリは正常です。私はこの問題を真偽の順序でしか見ません。 –

+3

20を取っていると40の結果を得る方法がわかりません。これは本当に正確なLINQステートメントですか? – devuxer

答えて

0

ここでの問題は、単一のブール型プロパティでのOrderBy使用すると、結果の完全な順序を提供しないということです。代わりに、2つの半分に結果を分割します。あなたはID、名前、およびIsRecommendedプロパティとIsRecommendedことであなただけのオーダーを持つエンティティを持っていたのであれば、例えば、あなたはこの順序付け得る可能性があります:

Id Name IsRecommended 
4 A  true 
3 B  true 
1 C  true 
2 D  false 
5 E  false 

をしかし、あなたも得る可能性があります

Id Name IsRecommended 
3 B  true 
1 C  true 
4 A  true 
5 E  false 
2 D  false 

またはすべての推奨エンティティが最初に来る他の注文。

Skip and TakeがLINQ to Entities(および多くの他のLINQ実装)で正しく動作するためには、行の順序付けが完全に決定されている必要があります。これがあなたのコメントで示した変更が問題を解決するように見える理由です。ただし、ソートしているプロパティの組み合わせが一意ではない場合は、実際には問題が解決されないことがあります。

完全に決定された注文を確実に得ることができる方法の1つは、注文するための第2のプロパティとして主キーを使用することです。上記の例を再度参考にすると、次のような順序になります。

Skip and Takeは一貫して動作します。

1

私はブール値で注文するために必要な、あなたが生成されたSQLを確認しました、これは

DbContext.Records.Select(t=> new {data = t, isRead = t.Foo == null ? 0 : 1}) 
.OrderBy(t=> t.isRead) 
.Select(t=> t.data).ToList(); 
関連する問題