قابلیت 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);
}
}