2009-04-11 14 views
4

FirstNameに従ってソートする次のLINQクエリが期待されましたが、OrderBy拡張メソッドは効果がないようです。LINQクエリの並べ替え順序を変更する

DataClassesDataContext dc = new DataClassesDataContext(); 

var query = from contact in dc.Contacts 
      select contact; 

query.OrderBy(c => c.FirstName); 

私は、最初のクエリ定義でORDERBYが含まれている場合すべてが正常に動作しますが、私は後で私のコードで条件に基づいて、それを修正することができるようにしたいです。

これはなぜ機能しないのでしょうか?

答えて

11

は、[並べ替え基準は新しいシーケンスを作成し

query = query.OrderBy(c => c.FirstName); 

または

var sortedQuery = query.OrderBy(c => c.FirstName); 

を使用してみてください。

7

問題は、OrderByが既存のクエリを変更していないことです。代わりに、クエリ内の値を順序付ける新しいクエリを作成しています。この結果をキャプチャする必要があります。

var sortedQuery = query.OrderBy(c => c.FirstName); 

これは事実上すべての単一LINQ演算子に当てはまります。問題のクエリは実際には変更されません。その代わりに、クエリの結果を新しいクエリ値にフィルタ処理または投影し、メソッドから返します。

7

@Mike Twoの応答に加えて、複数のソートを行うには、最初のOrderByの後にThenByを使用する必要があります。それ以外の場合は、最初の順序を置き換えます。

var query = from contact in dc.Contacts 
     select contact; 

query = query.OrderBy(c => c.FirstName); 
query = query.ThenBy(c => c.LastName); 

foreach (var contact in query) 
{ 
    ... 
} 

実は、私の好みはチェーンそれらにすべて一緒に使用して拡張メソッドになりますが、あなたはそれらを条件付きにする必要がある場合は明らかにこれは動作しません。

var query = dc.Contacts 
       .OrderBy(c => c.FirstName) 
       .ThenBy(c => c.LastName); 

foreach (var contact in query) 
{ 
    ... 
} 
関連する問題