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.