2010-03-03 53 views
5

選擇n個隨機行我知道運行常規的SQL命令時,使用通過LINQ2SQL

ORDER BY NEWID() 

功能。我想要做同樣的事情,但通過linq2sql。

我寧願不選擇整個範圍內,通過rnd.Next添加一個隨機數(),然後進行排序,最後...

回答

3

Marc Gravell發佈了一個solution here,它允許您定義一個在DataContext的分部類中使用NEWID的函數。不要將其放置在生成的DataContext類中,否則將來的更新會消除您添加的內容。

Marc展示瞭如何在查詢表達式語法中使用它。或者,使用點符號,可以這樣寫:

var results = dc.Table.OrderBy(r => dc.Random()).Take(n); 

如果您不熟悉創建部分類,只需向解決方案中添加一個新類即可。只要類定義使用帶有partial關鍵字的DataContext類名稱,它的名稱就無關緊要。例如,如果你的DataContext被命名爲XYZDataContext您可以添加一個名爲XYZDataContextPartial.cs新類,並把它定義爲:

namespace YourNamespace 
{ 
    public partial class XYZDataContext 
    { 
    } 
} 
+0

完美!馬克的解決方案完全按照我的意願工作。 – benpage 2010-03-03 22:45:29

2

嘗試Take擴展方法:

.OrderBy(x=>x.NewId) 
.Take(randomNumber); 

我們在這裏所做的是:在ASC爲了

  1. 排序NEWID場。
  2. 選擇第N行,其中N是隨機數。

如果您希望爲了是隨機的,試試這個:

.OrderBy(x => Guid.NewGuid()) 
.Take(20); 

我們在這裏所做的是:

  1. 訂單列表按隨機順序。
  2. 取前20行。