2011-11-22 129 views
3

我發現這個方便的查詢;LINQ2SQL獲取隨機記錄

SELECT TOP 1 * FROM Advertising ORDER BY NEWID() 

但需要把它變成一個LINQ查詢。

我試着做類似的事情;

var a = (from record in Advertising 
     select record) 

但無法弄清楚如何進行排序以便返回一個隨機記錄。

+1

可能的重複:http://stackoverflow.com/questions/648196/random-row-from-linq-to-sql – Polity

+1

也見:http:// weblogs。 asp.net/zeeshanhirani/archive/2008/07/23/returning-random-products-using-linq-to-sql.aspx – Polity

+0

關於可能的重複,我無法讓.Random()來工作 – griegs

回答

4

這是最簡單的可能只是直接執行命令。

var a = ctx.ExecuteQuery<Advertising>("select top 1 * from Advertising order by NEWID()").First(); 

你也可以用存儲過程做到這一點,或者如果你想要一個完全通用的方法來做到這一點,您可以查詢計數,然後生成在該範圍內的隨機數,蹦跳。 (正如其他人注意到,當我正在打字)

+0

我以爲可能有一個純LINQ的方式來做到這一點,但似乎我可能錯了,所以已經走了 – griegs

+0

@griegs - 查看前面給出的鏈接http://weblogs.asp.net/zeeshanhirani/archive/ 2008/07/23/returns-random-products-using-linq-to-sql.aspx它肯定是 可能使用LINQ – Polity

+0

@Polity,是啊我看到了,但看着它看起來有點混亂,我認爲另一個人會看它並說跆拳道?所以我因此而不予考慮 – griegs

3

這不會產生你正在尋找的SQL,而應返回一個隨機的結果,而無需檢索所有記錄:

Random r = new Random(); 
var record = r.Next(Advertising.Count()); 

var randomRecord = Advertising.Skip(record).FirstOrDefault(1); 

編輯:這也應該是比隨機排序更有效(除非SQL Server優化排序)

編輯2:取(1)應該是FirstOrDefault()返回一條記錄,而不是一條記錄長1條記錄。

+2

做兩個查詢。 –

+0

@MichaelStum它真的很重要,如果它是兩個查詢? –

+0

這可能並不理想,但會得到期望的結果,而且我不確定如何在單個查詢中執行此操作。這很複雜,因爲只有某些C#方法具有到SQL的映射。希望別人會有更好的解決方案,如果這是一個要求。 – TheEvilPenguin

0

這裏是我的一些隨機的方法

Public Shared Function GetSingleRandom(Of T)(ByVal target As IEnumerable(Of T)) As T 
     Dim r As New Random(DateTime.Now.Millisecond) 
     Dim position As Integer = r.Next(target.Count) 
     Return target.ElementAt(position) 
    End Function