PDA

View Full Version : سوال: async کردن چند IQueryable در LINQ



nunegandom
پنج شنبه 11 مرداد 1397, 11:24 صبح
سلام من چند تا query دارم که به صورت IQueryable هستند ، اگر بخوام همین ها هر ۳ تا شون با یک درخواست و به صورت Async اجرا بشن چطوری میشه؟
:لبخند:

ali_md110
پنج شنبه 11 مرداد 1397, 19:44 عصر
از این درخواست ها در Action استفاده میشه یا کاربرد دیگری دارد؟
همه این کوئری ها در نهایت در یک ویو نمایش داده میشود؟
اگر همگی در یک اکشن متد هست که ساده هست کافیه اکشن بصورت async تغریف کنید و از یک ویومدل که شامل چند لیست هست برای ارسال همه کوئری ها به سمت ویو در اون اکشن بهره ببرید
و یک نکته چون IQueryable یک درخواست خام هست و به دیتابیس ارسال نشده جهت استفاده در نهایت باید تبدیل به یک Tolist شود
وقتی یکی یا همه این کوئری ها تبدیل به Tolist شود فقط یکی از این چند کوئری های شما میتواند به عنوان خروجی متد شما باشد

nunegandom
جمعه 12 مرداد 1397, 21:50 عصر
خیلی ممنون از پاسختون، در اکشن استفاده میشه
همه به یک ویو ارسال میشه
var model = new AdminWidgetModel(); model.ContactList = await db.Contacts.OrderByDescending(y => y.id).Where(y => y.Status == (int)ContactStatus.New).Select(x => new ContactWidgetModel { Message = x.Message, Subject = x.Subject, Time = x.Date }).Skip(0).Take(5).ToListAsync();
model.FactorList = await db.factors.OrderByDescending(y => y.id)
.Where(y => y.FactorStatus == (int)FactorStatus.PayedService || y.FactorStatus == (int)FactorStatus.UnRegisteredUserPayed || y.FactorStatus == (int)FactorStatus.LoginPayeWithoutWallet)
.Select(x => new FactorWidgetModel { Name = x.service_name, Price = x.price_total }).Skip(0).Take(5).ToListAsync();
model.TicketList = await db.Contacts.OrderByDescending(y => y.id).Where(y => y.Status == (int)TicketStatus.CustomerReplayed).Select(x => new TicketWidgetModel { Subject = x.Subject, Message = x.Message }).Skip(0).Take(5).ToListAsync();
return View(model);
۳ تا کوئری هست و خوب طبق چیزایی که من میدونم با ToList از حالت Queryable در میاد و میشه IEnumerable که اجرا میشه
راهی هست حالا این ۳ تا توی یک درخواست برن سمت سرور یعنی با یک Connection؟ یعنی این ۳ تا فقط یک کانکشن برقرار کنن:متفکر:

ali_md110
شنبه 13 مرداد 1397, 22:43 عصر
در این مثال شما که فقط یک کانکشن هست:متفکر:
اگر منظور شما اینه که سه تا کوئری ارسال نشه
شما چاره ای ندارید چون درخواست های شما هرکدام از جداول متفاوت هستند و نتایج مختلفی دارند

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