linq to sql sorgularından rastgele kayıt getirmek

02.10.2008

Sql sorgularıyla kayıt çekerken sıralama bölümünü Order by NEWID() şeklinde düzenleyerek gelen kayıtların rasgele olmasını sağlıyorduk. Ancak Linq to Sql gibi bir o/r mapping ortamında bunu nasıl yapabiliriz? Kısa bir google araştırmasından sonra http://weblogs.asp.net/fmarguerie/archive/2008/01/10/randomizing-linq-to-sql-queries.aspx sayfasında bulduğum yöntemi paylaşmak istiyorum. Öncelikle bir view oluşturuyoruz zira NEWID fonksiyonuna scalar fonksiyon içerisinden direk erişim mümkün değil.

CREATE VIEW RandomView
AS
SELECT NEWID() As ID

şimdi de bu view'u kullanacak fonksiyonu oluşturuyoruz.

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

bu sql fonksiyonunu ise linq sorgularımızda şu şekilde kullanıyoruz;

MyDataContext myDC = new MyDataContext(); //DataContext'inizi bu varsayalım

Bir tane rasgele kayıt için

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

Rasgele kayıt listesi için

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

Rasgele getirdiğiniz kayıtların sonunda Take fonksiyonunu kullanarak alacağı kayıt sayısını da sınırlandırabilirsiniz (örneğin 5 kayıt)

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

Şimdilik bu kadar.