2011-07-12 109 views
3

大家下午好,隨機化實體框架查詢結果

我有一個listview填充使用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

這可以在不使用擴展方法的情況下使用純lambda表達式,但我沒有測試它 – Milox

+1

很酷,很高興你能工作。是否需要嘗試/捕獲?如果他們所做的只是拋出異常,是不是沒有它們的默認行爲? –

2

我相信這個職位的答案是你需要的東西:

Linq to Entities, random order

編輯:

首先獲得您的前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退出場景。你覺得它可以在DB做?就像如果你使得這一TSQL SELECT * FROM (選擇頂部20 *從類別順序按名稱)的子查詢 爲了通過NewGuid – Milox