تا %60 تخفیف خرید برای 4 نفر با صدور مدرک فقط تا
00 00 00
barbimusic

مشکل با IQueryable<>

سلام دوستان وقت به خیر .

ببخشید من یه مشکلی که دارم اینه که توی کد زیر تو برنامم وقتی از حالت IEnumerable<RefundList&gt; استفاده میکنم محاسبات بدون مشکل و منطقی محاسبه میشه ولی وقتی از حالت کوئری ریبل &gt;&gt; IQueryable&lt;RefundList> استفاده میکنم سریعتر میشه ولی در منطق اشتباه محاسبه میشه .

میخام که بتونم از کوئری ریبل استفاده کنم چون IEnumerable برنامم رو کند میکنه .

مشکل هم به این صورته که وقتی دیباگ میکنم میبینم با وجود اینکه شرط درست هست و سطر قسط مربوط به اون وام در جدول موجود هست ولی باز پیغام Value can not be null میده .

.

.

.

.خطا رو توی خط مربوط به AddRage میده

.

.

else
                        {
                            result_Refunds.AddRange(db.Refunds.Select(c => new Refund_List() { InstallmentCount=c.InstallmentCount,LoanId= c.LoanId }).Where(c => c.LoanId == found_Loan.Id).ToList() as IEnumerable<Refund_List>); //لیست تمام اقساط مربوط به وام مربوطه  
                            if (result_Refunds.Count != 0)
                            {
                                var ghest = result_Refunds.Where(c => c.LoanId == item.Id).Sum(c => c.InstallmentCount);
                                if (ghest != 0)
                                {
                                    ALL_COUNT_REFUNDS_By_LOAN = ghest.Value;
                                    found_Loan.Remained_Installment = (int)found_Loan.Installment - ghest;
                                    db.Entry(found_Loan).State = System.Data.Entity.EntityState.Modified;
                                    db.SaveChanges();
                                }
                            }
                        }
این سوال 1 پاسخ دارد.
لذت یادگیری با توسینسو
به عنوان شخصی که مدت هاست از سایت توسینسو استفاده می کنم باید بگم که واقعاً یکی از بهترین مرجع ها برای ارتقاء دانش شخصی هست. دوره های سایت، راهکارها و مطالب، همگی عالی هستند.

سلام

جای select و where را باهم عوض کنید مشکل تان حل می شود

مجید محمدی سامانی
barbimusic

سلام . آخه اگه اینجوری بشه مگه به حالت IEnumerable اجرا نمیشه ؟ اینجوری باز سرعت برنامم کند میشه . میخام که به صورت کوئری ریبل یکجا روی دیتابیس اجرا بشه ولی با سرعت زیاد .

سلام مشکل کندی به خاطر این هست که شما کل اطلاعات را آورده و بعد روی آن شرط قرار می دهی

اول شرط را اعمال کن و بعد select را

کدی که نوشته اید(خط 1) را بصورت زیر (خط 2) اصلاح کنید

.Select(c => new Refund_List() { InstallmentCount=c.InstallmentCount,LoanId= c.LoanId }).Where(c => c.LoanId == found_Loan.Id)


.Where(c => c.LoanId == found_Loan.Id).Select(c => new Refund_List() { InstallmentCount=c.InstallmentCount,LoanId= c.LoanId })
مجید محمدی سامانی
barbimusic

سلام . ممنونم ولی باز سوال داخل ذهن من حل نشده . الان طبق کد شما و تحلیل من اگه درست باشه اینطوری عمل میشه که اول کل اطلاعات ستون ها و روابط داخل رم بارگذاری میشه و بعد دستور Where روشون اعمال میشه . درسته ؟

ولی طبق کد من اول ستون های مربوطه رو سلکت میکنم و بعد روی همون ها شرط رو اعمال میکنم .

شاید تصور من اشتباه باشه . ممنون میشم توضیح بدید . ممنونم

سلام

تعداد ستون ها (اگر بالا 40 ستون) باشد واکشی تاخیر بیشتری خواهد داشت

اما مسئله را اینگونه در نظر بگیرید که شما اگر مثلا صد هزار رکورد داده(اطلاعات) داشته باشید با دستور select ، شما اول همه آن 100 هزارتا را از دیتابیس واکشی کرده و بعد شرط(های) مورد نظر را اعمال می کنید

ولی وقتی اول شرط را قبل از select در EF می نویسید اول شرط اعمال شده و بعد تعداد محدودی داده خواهید داشت

کد شما همه 100هزار رکورد را می آورد و بعد یک رکورد را انتخاب می کند (c => c.LoanId == found_Loan.Id) و این همان سرباری است که به رم تحمیل می شود

مجید محمدی سامانی
  • انتخاب شده به عنوان جواب توسط 1 نفر
پاسخ شما
برای ارسال پاسخ خود وارد شوید.