PDA

View Full Version : حرفه ای: چطور میشه از یه جدول انتخابهای تصادفی غیر تکراری به وصیله linq داشت؟



dontspeak
شنبه 05 شهریور 1390, 22:42 عصر
سلام دوستان یه جدول دارم با حدود 25000 رکورد و می خوام بصورت تصادفی 200 رکورد که یکی نیستند رو بخونم. دارم از linq استفاده میکنم و مشکل بزرگی که جلوی پام هست اینه که این سایت بازدید کننده خیلی زیادی داره و دنبال یه روش برای انتخاب رکورد بصورت تصادفی میگردم، که کمترین فشار رو روی سرور بیاره. دوستان اگه روشی و کدی دارند ممنون میشم اونو اینجا بزارید

dontspeak
یک شنبه 06 شهریور 1390, 00:08 صبح
کاری که من کردم اینه که یه متد نوشتم و توی اون یک آرایه از اعداد تصادفی غیر تکراری قرار می گیره. و از این اعداد در یک متد دیگه برای انتخاب رکوردها استفاده کردم. حالا دوتا سوال پیش میاد آیا این روش بهینه ترین روش از نظر مصرف منابع سرور هست؟ و سوال دوم: میشه تعداد رکورد های توی جدول با استفاده از count() در linq بدست آورد. و اعداد تصادفی رو در بازه 0 تا count رو برگردوند. حالا چطور میشه بجای استفاده از id از محل قرار گیری یک رکورد استفاده کرد؟ مثلا چطور میشه یک جدول رو بر اساس id مرتب کرد و رکورد پنجم یا nاُم اونو خوند؟

ASPX
یک شنبه 06 شهریور 1390, 08:01 صبح
Random rand = new Random();
var randomSeq = Enumerable.Repeat(0, N).Select(i => rand.Next());

Saman Hashemi
یک شنبه 06 شهریور 1390, 09:15 صبح
چرا اين كار سمت sql server انجام نميدي با يه sp امكان پذيره اينقدر دردسر نداره كارايي بالاتري هم داره...!
SELECT fields
FROM table
tablesample (10 percent)

dontspeak
یک شنبه 06 شهریور 1390, 12:42 عصر
سامان جان ممنون ولی می خوام از linq استفاده کنم بهر حال linq هم باید راه حلی داشته باشه.
aspx جان از شما هم ممنونم. منتهی من این کد و سایر کدها رو توی سایتهای انگلیسی سرچ کردم ولی نتونستم ازشون استفاده کنم؟ میشه اگه شما در مورد این کد اطلاعاتی دارید یکم توضیح در مورد این کد بدید و بگید چطور باید بکارشون ببرم؟ مورد بعدی اینکه من الان دارم این انتخاب تصادفی و غیر تکراری رو انجام میدم و روشم رو عوض کردم اومدم 4 عدد تصادفی بین 0 تا 10 انجام دادم (چون فعلا دارم تست میکنم روی 25000 رکورد نیست) این چهار عدد رو توی آرایه قرار دادم و اومدم کل آی دی ها رو هم داخل یه آرایه دیگه قرار دادم و بعد اومدم طبق آرایه اول از آرایه دوم انتخاب کردم یعنی مثلا اولین مقدار آرایه اول 4 باشه از آرایه دوم هم ایندکس 4 رو می خونم.
حالا برام مهمه که راه حلی رو داشته باشم که کمترین فشار رو به سرور بیاره. من خودم فکر میکنم چون بر اساس ایندکس از آرایه داره می خونه زیاد فشار به سرور نیاد اما بازم مطمئن نیستم

ASPX
یک شنبه 06 شهریور 1390, 13:16 عصر
من این کد و سایر کدها رو توی سایتهای انگلیسی سرچ کردم ولی نتونستم ازشون استفاده کنم
آخر کوئری ات این کد را اضافه کن بجای N تعداد تکرار را بگذار

.Repeat(0, N).Select(i => rand.Next());

Himalaya
یک شنبه 06 شهریور 1390, 14:12 عصر
سلام

بهر حال linq هم باید راه حلی داشته باشه
حتما داره
فرض کن فایل Test.dbml رو ایجاد کردیم و جدولمون رو توش قرار دادیم. این فایل رو view code کن و کد زیر رو تو کلاس TestDataContext قرار بده

[Function(Name = "NEWID", IsComposable = true)]
public Guid Random()
{
return Guid.NewGuid();
}

بعد واسه کوئری گرفتن مثلا این کدا رو تو دکمه قرار بده

var db = new TestDataContext();
var query = db.Categories.OrderBy(c => db.Random()).Take(5);

GridView1.DataSource = query;
GridView1.DataBind();
کوئری که واسه اجرا به sql server پاس داده میشه این هستش (البته با توجه به جدول خودم)

SELECT TOP (5) [t0].[CategoryID], [t0].[ParentID], [t0].[Title], [t0].[Photo], [t0].[Active]
FROM [dbo].[Category] AS [t0]
ORDER BY NEWID()
اینجا ORDER BY NEWID و TOP (5) که تو دستور sql ایجاد شدن، همون چیزی هست که مد نظر شماس

dontspeak
یک شنبه 06 شهریور 1390, 14:39 عصر
aspx جان ممنون. ولی واقعا من ربط اینو با دیتابیس نمی دونم. یعنی اینکه با این کد چطور به دیتابیس بگم که رندوم انتخاب کن؟ چون این فقط یه سری عدد رندوم بهم میده درسته؟

Saman Hashemi
یک شنبه 06 شهریور 1390, 14:56 عصر
من براي كارايي گفتم و الا راه حل كه داره دوستانم ارائه دادن در ضمن اون دستور از كل بازهاي بانك رندوم ميكنه و از دستور Select top بازدهي بيشتري داره...!

dontspeak
یک شنبه 06 شهریور 1390, 17:27 عصر
ممنون از همه دوستان مخصوصا کرجی. خیلی این کد بهتر و قشنگتر از اون کد قبلی خودمه. از aspx و داداش سامان عزیزم بخاطر اینکه کمکم کردن ممنونم