مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

salman_b

عضویت از 1396/02/18

مسئله ی عجیب در پاسخ دادن کوئری های Linq در 6 Entity Framework

  • یکشنبه 1 بهمن 1396
  • 15:23
تشکر میکنم

با سلام

مسئله ی عجیب اینه که مثلا یه کوئری ثابت (Linq To Entity) که immediate هم هست و .Tolist() هست، در هر بار اجرای برنامه زمان پاسخ فرق داره! مثلا یه بار 2 ثانیه طول میکشه یه بار 4 ثانیه یه بار خیلی سریع و زیر 0.5 ثانیه پاسخ میده

چه دلیلی داره آخه ؟

در صورتی که با ADO.Net همیشه تو یه زمان ثابت پاسخ میده!

لطفا راهنمایی کنید

با تشکر

پاسخ های این پرسش

تعداد پاسخ ها : 7 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • یکشنبه 1 بهمن 1396
  • 16:34

کدی که در حال اجرا کردن کوئری موردنظر می باشد را قرار دهید.

کاربر سایت

salman_b

عضویت از 1396/02/18

  • یکشنبه 1 بهمن 1396
  • 16:43

چون حالت های زیادی داره با سوییچ پیاده سازی کردیم که در نهایت این تابع اجرا میشه

و اینکه این کلاس TransferList دارای تعدادی جنریک لیست استاتیک هست برای اینکه داده ها رو بین پیج های برنامه بتونم جابه جا کنم و همه جا در دسترسم باشه.

در واقع docSearch یک جنریک لیست استاتیک از کلاسی public و غیر استاتیک هست

دلیل join خوردن ها هم اینه که ارتباطی بین این دو جدول وجود نداره!!!

TransferLists.docSearch = (from c in db.sanad
                             where
                             c.plk.Contains(pelak)

                             join
                             d in db.tbl_ashkhas on c.rid equals d.id into customer //مشتری
                             join
                             f in db.tbl_ashkhas on c.cid equals f.id into colleague //همکار
                             join
                             g in db.tbl_ashkhas on c.jbja equals g.id into jabejaye

                             from m in customer.DefaultIfEmpty()
                             from h in colleague.DefaultIfEmpty()
                             from j in jabejaye.DefaultIfEmpty()

                             select new Documents
                             {
                                 id = c.id,
                                 cname = h.rname,
                                 cid = h.id,
                                 ctn = h.rtn,
                                 ctell = h.rtel,
                                 rname = m.rname,
                                 rid = m.id,
                                 tvd = c.tvd,
                                 dct = h.dct,
                                 gng = c.gng,
                                 shm = c.shm,
                                 shsh = c.shsh,
                                 plk = c.plk,
                                 clr = c.clr,
                                 cpn = c.cpn,
                                 mob = c.mob,
                                 shb = c.shb,
                                 shs = c.shs,
                                 dtv = c.dtv,
                                 ttm = c.ttm,
                                 pnb = c.pnb,
                                 odt = c.odt,
                                 dcb = c.dcb,
                                 frn = m.frn,
                                 rsh = m.rsh,
                                 rcn = m.rcn,
                                 ptlc = m.ptlc,
                                 add = m.add,
                                 radd = m.radd,
                                 rtn = m.rtn,
                                 rtel = m.rtel,
                                 gpn = c.gpn,
                                 dcs = c.dcs,
                                 dgd = c.dgd,
                                 emza = c.emza,
                                 jbja = c.jbja,
                                 jname = j.rname,
                                 tkj = c.tkj,
                                 dtl = c.dtl,
                                 trkht = c.trkht,
                                 rbd = m.rbd,
                                 rts = m.rts,
                                 rcbd = m.rcbd,
                                 rcs = m.rcs

                             }).ToList();

                    if (TransferLists.docSearch.Count() != 0)
                    {
                        dataGrid.ItemsSource = TransferLists.docSearch.ToList();
                        IsSelect = true;
                    }

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • یکشنبه 1 بهمن 1396
  • 17:22

وحشتناک ترین کوئری هست که تا به امروز دیدم.

لطفا راجب جمله زیر بیشتر توضیح بدید.

"دلیل join خوردن ها هم اینه که ارتباطی بین این دو جدول وجود نداره!"

شما قصد دارید عملیات جستجو انجام بدید و این جستجو حاصل چند جدول باشد؟

کاربر سایت

salman_b

عضویت از 1396/02/18

  • یکشنبه 1 بهمن 1396
  • 17:33

خودم متوجه هستم که فاجعه است :))

اما خب چاره ای نیست :/

من که نمیتونم کل طراحی دیتابیس رو عوض کنم

وظیفه ی من چیز دیگری است

ببینین مسئله اینه که اشخاص سه دسته هستند و هر سه دسته داخل یک جدول هستند، و بین جدول اشخاص با جدول اسناد ارتباطی نیست که با کلید ها به شخص مورد نظر دسترسی پیدا کنیم، برای همین مجبور شدم join بزنم و شخص های مورد نظر رو پیدا کنم و چون سه شخص میخوام که ممکنه وجود نداشته باشن از right join استفاده کردم و چون شخص ها سه دسته هستند سه بار join زدم

خودم متوجه هستم که خیلی عجیب هستش!

این جستجو از دو جدول بدست میاد یعنی حاصل دو جدول هستش اما چون سه دسته شخص در tbl_Ahskhas وجود داره برای پیدا کردن هر شخص یک بار join زدیم که در نهایت سه بار join خورده!

اما این عجیب تره که این کوئری با یک مقدار ورودی ثابت در هربار اجرا، زمان های اجرای متفاوتی دارد!

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • یکشنبه 1 بهمن 1396
  • 18:51

برای بهتر کردن عملکرد این کوئری تنها چند پیشنهاد یک این که کوئری ها را به قسمت های کوچک بشکنید دوم این که از AsNoTracking استفاده کنید تا عملکرد آن بهبود یابد.

استفاده از AsNoTracking:

 db.sanad.AsNoTracking()

کاربر سایت

salman_b

عضویت از 1396/02/18

  • دوشنبه 2 بهمن 1396
  • 10:37

ممنونم ازتون آقای علیزاده

معضل بزرگی بود که به لطف شما و فقط با همون دستور حل شد.

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • دوشنبه 2 بهمن 1396
  • 11:15

برای بهبود عملکرد نکاتی در مقاله زیر مطرح شده مطالعه کنید:

نکاتی در مورد بهبود عملکرد وب سایت

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)