2011-07-12 12 views
3

午後、エンティティフレームワークのクエリ結果をランダム化

linqdatasource +エンティティフレームワークのiqueryableクエリを使用してリストビューを作成しました。

クエリは、このようなテイク(T-SQLの一番上)を使用しています:

context.Categories().OrderBy(c=>c.Name).Take(20); 

をだから、私が名前順たい20回の記録をもたらします。

ここでは、20個のレコードをランダムな順序で表示したいと考えています。何が最良のアプローチは、これを実現する?

答えて

0

をこれは、その後の呼び出し、最初の名前で注文し、拡張メソッドを使用して非常に単純であることが判明しました(T-SQLのトップを)取り、後で

 context.Categories().OrderByName().Take(20).OrderByRandom(); 


     public static IQueryable<Category> OrderByName(this IQueryable<Category> query) 
     { 
       return from c in query 
         orderby c.Name 
         select c; 
     } 



     public static IQueryable<T> OrderByRandom<T>(this IQueryable<T> query) 
     { 
       return (from q in query 
         orderby Guid.NewGuid() 
         select q); 
     } 
+0

これは拡張メソッドなし純粋なラムダ式を使用して動作することがありますが、私はそれをテストしていません – Milox

+1

クール、あなたはそれが働いてうれしい。 try/catchが必要ですか?彼らがすべて例外をスローした場合、それがなければデフォルトの動作ではないでしょうか? –

2

は、私がこの記事では答えは何が必要であると考えている:

Linq to Entities, random order

EDIT:

最初にあなたのトップ20レコードを取得します。そして、あなたはすでにフェッチきた上位20品目で、全くデータベースを含まない、C#でそれらすべてをランダム:

var yourRecords = context.Categories().OrderBy(c=>c.Name).Take(20); // I believe .Take() triggers the actual database call 
yourRecords = yourRecords.OrderBy(a => Guid.NewGuid()); // then randomize the items now that they are in C# memory 
+0

こんにちはをランダム化する、あなたの答えに感謝しかし、それは全体のデータベーステーブルから私の20のランダムなレコードを取得しますし、私は20のトップを取得したいので、私は必要なものではありませんデータベースからレコードを取得し、ランダムな順序で20レコードを表示する – Milox

+0

私の編集を参照してください... –

+0

それは良いと論理的な答えです、それはちょうど私のlinqdatasouを残すシナリオから抜け出す。あなたがこれをTSQLで作ったのと同じように、 select *から (カテゴリから上位に*を選択してください)サブクエリ order by NewGuid – Milox