قابلیت Compiled queries در Entity Framework Core

با استفاده از این قابلیت در EF Core میتوانیم Query خود را ذخیره و بعدا استفاده کنیم .

فرض کنید یک کلاس با نام Categrory در Context خود ثبت کردیم و میخواییم دسته بندی را براساس Id آن نمایش دهیم .

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
     public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
     {
     }

     public DbSet<Category> Categories { get; set; }


     public IList<Category> GetCategory(Guid id)
     {
         return Categories.Include(c => c.Translations)
                          .ThenInclude(c => c.Language)
                          .Include(c => c.Parent)
                          .Where(c => c.Id == id)
                          .FirstOrDefault();
     }

}

فرض کنید ما سایتی با دسته بندی محصولات داریم و از آنجا که درخواست نیاز به بارگیری دسته فعلی زیاد است ، پس جستجو در سایت ما بسیار مهم است .

با کنار گذاشتن تمام بهینه سازی هایی که میتوانیم در پایگاه داده و در سطح اپلیکیشن انجام دهیم با این روش میتوانیم کوئری خود را یک بار نوشته و در دفعات بعدی از آن استفاده کرده و دیگر به پایگاه داده مراجعه نکنیم .

در اینجا Compiled Query را Func در نظر میگیریم که بعدا بتوانیم آن را صدا بزنیم . 

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    private static Func<ApplicationDbContext, Guid, IQueryable<Category>> _getCategory =
            EF.CompileQuery((ApplicationDbContext context, Guid id) =>
                context.Categories.Include(c => c.Translations)
                                  .ThenInclude(c => c.Language)
                                  .Include(c => c.Parent)
                                  .Where(c => c.Id == id)
                                  .FirstOrDefault());
 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }
 
    public DbSet<Category> Categories { get; set; }
 
    public Category GetCategory(Guid id)
    {
        return _getCategory(this, id);
    }
 
}

در اینجا ما یک بار کوئری خود را بر اساس Id یک Category ساختیم و برای استفاده مجدد میتوانیم از آن استفاده کنیم 

استفاده از Asynchronous در Compiled queries

برای کارایی بهتر کوئری خود میتوانید درخواستها را به صورت نا همزمان بنویسیم 

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    private static Func<ApplicationDbContext, Guid, Task<Category>> _getCategory =
            EF.CompileAsyncQuery((ApplicationDbContext context, Guid id) =>
                context.Categories.Include(c => c.Translations)
                        .ThenInclude(c => c.Language)
                        .Include(c => c.Parent)
                        .Where(c => c.Id == id)
                        .FirstOrDefault());
 
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }
 
    public DbSet<Category> Categories { get; set; }
 
    public async Task<Category> GetCategoryAsync(Guid id)
    {
        return await _getCategory(this, id);
    }
}