۳ حمیدرضا جلیلی
سوال در رابطه با عملکرد برنامه - تکیمل شده سوال قبلی
جامعه ASP.NET ایجاد شده در ۰۱ فروردین ۱۴۰۲

در کنترلر ProductController ما یک کنترلر با چند Action داریم که به ازای اکشن‌ها هم view ساخته ایم

اگر در view ای که به کاربر نمایش داده میشود کاربر گزینه پیش فرض یا Index را وقتی خواست مشاهده کند دستورات Action مربوط به Index در ProductController باید اجزار شوند

همه ی داده هایی که بین کنترلر , View‌ها ردو بدل میشوند از طریق مدل‌ها هستند پس طبیعتا با مدل‌ها سرو کار داریم و وقتی صحبت از مدل‌ها میشود یعنی با ProductService‌ها سرو کار داریم:

 public IActionResult Index()
        {
            var model = _productService.FindAllAsync().Result;
            return View(model);
        }

در کد بالا از طریق _productService به متد FindAllSync دسترسی پیدا میکنیم و در این متد هم به Productcoreservice‌ها دسترسی پیدا میکنیم و یعنی از این به بعد دسترسی پیدا کردیم به متدهای مربوط به Entity ها

 public async Task<List> FindAllAsync()
        {
            return _productCoreService.GetAll().ToList().ToListModel();
        }

حالا در کلاس Productcoreservice چون از Baseservice ارث بری کرده است الان میتوانیم متد GetAll() را فراخوانی کنیم و همچنین این دستور عمل Map هم انجام میشه و Entity‌ها تبدیل میشن به Model و بر میگرده به تابع FindAllAsync کلاس ProductService , و در نهایت یک Model را برمیگرداند

  public virtual IEnumerable GetAll()
        {
            return _repository.GetAll();
        }

متد GetAll در Productcoreservice هم به یک object از IRepository دسترسی دارد که آنجا هم یک متد GetAll وجود دارد و در نهایت پیاده سازی آن دستور هم در کلاس EfRepository است ودستور زیر اجرا میشود:

 

در کلاسEfRepository یک فیلد از Dbset و DbContext داریم و در نهایت متد زیر اجرا میشود: و در اینجا متد GetAll گویا از DbContext استفاده نکرده است و لی اگر نیاز به اجرای سایر متدها مانند ADD , Update , Delete بود با استفاده از DbContext این و متدهای Save آن تغییرات اعمال میشد.

   private readonly OnlineShopDbContext _context;
        private DbSet _entities;
----------------------------------------------------------
  public virtual IEnumerable GetAll()
        {
            try
            {
                return Entities.ToList();
            }
            catch (DbUpdateException exception)
            {
                throw new Exception(GetFullErrorTextAndRollbackEntityChanges(exception), exception);
            }
        }

خلاصه : داده‌های از دیتابیس با استفاده از DbSet و DbContext در repository برداشته شدن. داده شدن به کلاس ProductCoreService اون هم Entity رو داد به ProductService و در اینجا تبدیل به مدل شد و به کنترلر بازگشت داده شد و کنترلر هم در Action مربوطه که ایندکس باشه ارسالش کرد به View تا کاربر ببینه.

سوال اول :آیا تحلیل به درستی صورت گرفته و یا دارای اشتباهی است؟

سوال دوم: قطعه کد آخر چه کاری انجام میدهد؟ و در Entities که یک نمونه از Dbset است چه میکند و چرا تبدیل به ToList میکنیم رو نمیدونم

ممنونم

...........

حمیدرضا جلیلی ۰۱ فروردین ۱۴۰۲، ۰۷:۳۰

سلام

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

علت اینکه اطلاعات رو ToList کردیم اینه که اطلاعات از DbSet به صورت IQueryable به دست ما میرسن و در اصل هنوز به کلاس هایی که بتونیم ازشون استفاده کنیم در نیومدن. برای اینکه به IEnumerable‌تبدیلشون کنیم لازمه اون‌ها رو به لیست تبدیل کنیم.

به طور خلاصه IQueryable اطلاعاتیه که میشه روش فیلتر انجام داد اما هنوز سمت دیتابیس نرفته و به دیتا تبدیل نشده. اما زمانی که ToList میکنیم query روی دیتابیس زده میشه.

پیشنهاد میکنم در مورد تفاوت‌های IQueryable و IEnumerable مطالعه کنید ممکنه براتون جالب باشه.

بهترین پاسخ
محمدرضا میرزایی ۲۰ فروردین ۱۴۰۲، ۱۲:۲۰

ممنونم

حمیدرضا جلیلی ۲۱ فروردین ۱۴۰۲، ۰۸:۵۳