50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

مشکل با 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();
                                }
                            }
                        }
پرسیده شده در 1397/09/25 توسط

5 پاسخ

0

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

پاسخ در 1397/09/26 توسط
0

سلام

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

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

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

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

پاسخ در 1397/09/27 توسط
0

سلام

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

پاسخ در 1397/09/26 توسط
0

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

اول شرط را اعمال کن و بعد 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 })
پاسخ در 1397/09/26 توسط
0

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

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

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

پاسخ در 1397/09/27 توسط

پاسخ شما