2009年12月9日水曜日

LinqToSqlでランダムセレクト

今回はLinqToSqlでレコードをランダムに取得する方法を解説する。ランダムに画像を複数件表示しなければならないときに実装した方法だ。

通常のSQLでは下記のようなクエリとなる。

select top 10 * from table order by NEWID()

これで10件のレコードをランダムに取得できる。これをLinqで記述すると下記になる。

partial class MyDataContext { 
     [Function(Name="NEWID", IsComposable=true)]  
     public Guid Random()  
     {
         throw new NotImplementedException();  
     } 
} 

var cust = (from row in db.Table
           order by db.Random() 
           select row).Take(10); 

元ネタはStack Overflowの下記のリンクだ。処理の詳細はSQL ServerのNEWID関数をRandomというDataContextの関数として実装し、前述のSQLをLinq上で再現している。

http://stackoverflow.com/questions/648196/random-row-from-linq-to-sql

上記リンク先でも指摘されているが、この方法は小さいテーブル用だ。多量のレコードに対して行うと大変な負荷をかけるので避けるようにしたい。大きいテーブル用のアプローチ方法としては全レコードに対してNEWIDするのではなく、ある程度小さくした集団に対して使用するべきだろう。上記リンク先にも大きいテーブル用のアプローチ方法が記載されいてるがここで紹介している内容と処理内容が異なるのでとくには解説しない。

ランダム、ランダムと書いていたらランダムがゲシュタルト崩壊してきた・・・。

0 件のコメント:

コメントを投稿