PDA

View Full Version : سوال: سرعت پاینن Fill کردن دیتا گرید با select تو در تو در linq



ashkan1234
چهارشنبه 01 بهمن 1393, 21:17 عصر
سلام.
وقتی میخوام از فیلد یک جدول دیگر با else ، if سرعت لود داده ها بسیار پایین میاد.
آیا طریقه کد نویسی بنده درسته؟
اینو برای مثال ببینید:
var select = db.TBL_Names.OrderByDescending(f => f.Id).ToList().Select((c, index) => new {
c.Id,
RowIndex = index + 1,
Test = !c.Table2s.Any()
? "is valid"
: c.Table2s.OrderByDescending(d => d.Id)
.FirstOrDefault()
.Bool.Choose("is valid",
true, "invalid",
false, "is valid"),
});
dgv.DataSource = select;

SabaSabouhi
پنج شنبه 02 بهمن 1393, 09:14 صبح
سلام
بله، به نظر میاد کار شما درست نیست.
اول این که وقتی به حالت c.Table2s استفاده می‌کنی سرعت پایین میاد. خودت Join کن.
دوم این که ToList باعث اجرای query و آمدن اطلاعات به حافظه‌ی کامپیوتر می‌شه.
برای حداکثر سرعت باید فقط یک ToList در آخر کار داشته باشی. یعنی درست جایی که دیگه
نیازی به دیتابیس نداری.

صبا صبوحی

ashkan1234
پنج شنبه 02 بهمن 1393, 10:00 صبح
سلام
بله، به نظر میاد کار شما درست نیست.
اول این که وقتی به حالت c.Table2s استفاده می‌کنی سرعت پایین میاد. خودت Join کن.
دوم این که ToList باعث اجرای query و آمدن اطلاعات به حافظه‌ی کامپیوتر می‌شه.
برای حداکثر سرعت باید فقط یک ToList در آخر کار داشته باشی. یعنی درست جایی که دیگه
نیازی به دیتابیس نداری.

صبا صبوحی
سپاسگذارم از پاسخ شما.
اگر در آن قسمت از ToList استفاده نکنم حتما با خطای زیر روبرو میشم:
Unsupported overload used for query operator 'Select'.
ولی اینبار بنده ToList را حذف نمودم و بجای آن از AsEnumerable
استفاده نمودم.
تاثیر محسوسی مشاهده نشد!
حالا Join هم امتحان میکنم.
اگر بازهم راهی بنظرتون میرسه سپاسگذار میشم پاسخ دهید...:لبخند:

ashkan1234
جمعه 03 بهمن 1393, 10:30 صبح
سلام.
مشکل رو برطرف کردم.
دوستانی که مثل بنده یروزی به چنین مشکلاتی برخورد کردند.
بجای استفاده از عبارتهای lambda از query لینک استفاده کنید ، که سرعتش بسیار بالاست...
موفق باشید

SabaSabouhi
شنبه 04 بهمن 1393, 08:53 صبح
سلام
دوست من دو تا پست زدی که برای هر دو باید چیزهایی رو بگم.
1. ToList و AsEnumerable فرقی ندارن. هر دو از دیتابیس اطلاعات رو می‌خونن.
من نمی‌دونم دقیقاً می‌خوای چیکار کنی. اما راه داره که مجبور نشی بری سراغ Db.
من خودم یه جاهایی در شرایط پیچیده این مشکل رو داشتم، وقت گذاشتم و مشکل رو حل کردم.

2. استفاده از query لینک مشکل شما رو حل کرده، چون همون اتفاقی افتاده که من گفتم. یعنی فقط
یکبار رفتی سراغ دیتابیس.
با Lambda هم می‌تونی همین کار رو انجام بدی، فقط راهش رو پیدا کن.
در پایان Lambda و LinQ query هر دو یک کار می‌کنن. هر کدوم رو که راحت‌تر هستی انجام بده
من Lambda رو ترجیح می‌دم چون
* خیلی سریع‌تر می‌تونم بنویسم
* خیلی خواناتر هست.

این خوانا بودن خیلی اهمیت داره. بخصوص وقتی که بعد از 1 سال کنار گذاشتن پروژه مجبور بشی یک تغییر توش بدی.
اونجا هست که خوانا بودن ارزشش معلوم می‌شه. یا این که یک نفر دیگه بخواد این کار رو انجام بده.

صبا صبوحی