linq to sql sorgularindan rastgele kayit getirmek

10/2/2008

Sql sorgulariyla kayit çekerken siralama bölümünü Order by NEWID() seklinde düzenleyerek gelen kayitlarin rasgele olmasini sagliyorduk. Ancak Linq to Sql gibi bir o/r mapping ortaminda bunu nasil yapabiliriz? Kisa bir google arastirmasindan sonra http://weblogs.asp.net/fmarguerie/archive/2008/01/10/randomizing-linq-to-sql-queries.aspx sayfasinda buldugum yöntemi paylasmak istiyorum. Öncelikle bir view olusturuyoruz zira NEWID fonksiyonuna scalar fonksiyon içerisinden direk erisim mümkün degil.

CREATE VIEW RandomView
AS
SELECT NEWID() As ID

simdi de bu view''u kullanacak fonksiyonu olusturuyoruz.

CREATE FUNCTION GetNewId
(
)
RETURNS uniqueidentifier
AS
BEGIN
RETURN (SELECT ID FROM RandomView)
END

bu sql fonksiyonunu ise linq sorgularimizda su sekilde kullaniyoruz;

MyDataContext myDC = new MyDataContext(); //DataContext''inizi bu varsayalim

Bir tane rasgele kayit için

var randomUser = myDC.Users.OrderBy(u => myDC.GetNewId()).First();

Rasgele kayit listesi için

var randomUsers = from users in myDC.Users
                  orderby myDC.GetNewId()
                  select users.Username;

Rasgele getirdiginiz kayitlarin sonunda Take fonksiyonunu kullanarak alacagi kayit sayisini da sinirlandirabilirsiniz (örnegin 5 kayit)

var randomUsers = (from users in myDC.Users
                   orderby myDC.GetNewId()
                   select users.Username).Take(5);

Simdilik bu kadar.