با سلام
مسئله ی عجیب اینه که مثلا یه کوئری ثابت (Linq To Entity) که immediate هم هست و .Tolist() هست، در هر بار اجرای برنامه زمان پاسخ فرق داره! مثلا یه بار 2 ثانیه طول میکشه یه بار 4 ثانیه یه بار خیلی سریع و زیر 0.5 ثانیه پاسخ میده
چه دلیلی داره آخه ؟
در صورتی که با ADO.Net همیشه تو یه زمان ثابت پاسخ میده!
لطفا راهنمایی کنید
با تشکر
کدی که در حال اجرا کردن کوئری موردنظر می باشد را قرار دهید.
چون حالت های زیادی داره با سوییچ پیاده سازی کردیم که در نهایت این تابع اجرا میشه
و اینکه این کلاس 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; }
وحشتناک ترین کوئری هست که تا به امروز دیدم.
لطفا راجب جمله زیر بیشتر توضیح بدید.
"دلیل join خوردن ها هم اینه که ارتباطی بین این دو جدول وجود نداره!"
شما قصد دارید عملیات جستجو انجام بدید و این جستجو حاصل چند جدول باشد؟
خودم متوجه هستم که فاجعه است :))
اما خب چاره ای نیست :/
من که نمیتونم کل طراحی دیتابیس رو عوض کنم
وظیفه ی من چیز دیگری است
ببینین مسئله اینه که اشخاص سه دسته هستند و هر سه دسته داخل یک جدول هستند، و بین جدول اشخاص با جدول اسناد ارتباطی نیست که با کلید ها به شخص مورد نظر دسترسی پیدا کنیم، برای همین مجبور شدم join بزنم و شخص های مورد نظر رو پیدا کنم و چون سه شخص میخوام که ممکنه وجود نداشته باشن از right join استفاده کردم و چون شخص ها سه دسته هستند سه بار join زدم
خودم متوجه هستم که خیلی عجیب هستش!
این جستجو از دو جدول بدست میاد یعنی حاصل دو جدول هستش اما چون سه دسته شخص در tbl_Ahskhas وجود داره برای پیدا کردن هر شخص یک بار join زدیم که در نهایت سه بار join خورده!
اما این عجیب تره که این کوئری با یک مقدار ورودی ثابت در هربار اجرا، زمان های اجرای متفاوتی دارد!
برای بهتر کردن عملکرد این کوئری تنها چند پیشنهاد یک این که کوئری ها را به قسمت های کوچک بشکنید دوم این که از AsNoTracking استفاده کنید تا عملکرد آن بهبود یابد.
استفاده از AsNoTracking:
db.sanad.AsNoTracking()
ممنونم ازتون آقای علیزاده
معضل بزرگی بود که به لطف شما و فقط با همون دستور حل شد.
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)