عنوان:

‫بهبود پارامترسازی کوئری‌ها در Entity Framework Core 9.0


نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۲/۲۷ ۱۴:۲۵
آدرس: www.dntips.ir
مقدمه

Entity Framework Core (EF Core) به‌عنوان یک ابزار قدرتمند ORM در اکوسیستم .NET، همواره در حال تکامل است. نسخه 9.0 این ابزار که در نوامبر 2024 منتشر شد، قابلیت‌های جدیدی را برای بهبود عملکرد کوئری‌ها معرفی کرده است. یکی از مهم‌ترین این قابلیت‌ها، ویژگی پارامترسازی بهتر با استفاده از متد EF.Parameter<T> است.


مفهوم پارامترسازی و چالش‌های پیشین

در نسخه‌های قبلی EF Core، کوئری‌هایی که ترکیبی از مقادیر ثابت و متغیر داشتند، به‌خوبی پارامترسازی نمی‌شدند. به‌عنوان مثال، در کد زیر از مقاله اوزار، بخشی از فیلتر ثابت است و بخشی پویا:
var posts = context.Posts.Where(p => p.Title == ".NET Blog" && p.Id == id);
این کد یک کوئری SQL تولید می‌کند که ".NET Blog" به‌صورت ثابت در آن قرار دارد، اما id پارامترسازی می‌شود. این رفتار باعث می‌شود پلن‌های اجرایی متعددی در حافظه کش شوند که مصرف CPU و حافظه را افزایش می‌دهد.


معرفی EF.Parameter<T>

EF Core 9.0 با معرفی متد EF.Parameter<T> این مشکل را حل کرده است. این متد به توسعه‌دهندگان اجازه می‌دهد مقادیر ثابت را به‌صورت پارامتر درآورند. جالیا در مقاله خود مثالی ارائه می‌دهد:
async Task<List<Employee>> GetEmployees(int employeeId)
{
    return await context.Employees
        .Where(e => e.Id == employeeId && e.IsActive == EF.Parameter(true))
        .ToListAsync();
}
نتیجه این کد، یک کوئری SQL است که در آن، هر دو مقدار employeeId و true پارامترسازی می‌شوند:
SELECT [e].[Id], [e].[IsActive]
FROM [Employees] AS [e]
WHERE [e].[Id] = @__employeeId_0 AND [e].[IsActive] = @__p_1
این رویکرد نه‌تنها کش پلن‌ها را بهینه‌تر می‌کند، بلکه نظارت بر عملکرد را نیز بهبود می‌بخشد.


مزایا و کاربردها

کاهش بار CPU، استفاده مجدد از پلن‌ها و مصرف کمتر حافظه. هرچند این تغییر نیازمند ویرایش دستی کد است و به‌صورت خودکار اعمال نمی‌شود، که ممکن است برای برخی پروژه‌ها چالش‌برانگیز باشد.


مقایسه با EF.Constant<T>

متد EF.Constant<T> در EF Core 8.0، برعکس این حالت عمل می‌کند و پارامترها را به ثابت تبدیل می‌کند. برای مثال:
.Where(e => e.Id == EF.Constant(employeeId) && e.IsActive == EF.Parameter(true))
این انعطاف‌پذیری به توسعه‌دهندگان اجازه می‌دهد بسته به نیاز پروژه، بین پارامترسازی و ثابت‌سازی، یکی را انتخاب کنند.


نتیجه‌گیری

EF Core 9.0 با معرفی EF.Parameter<T> گامی مهم در جهت بهینه‌سازی کوئری‌ها برداشته است. این ویژگی به توسعه‌دهندگان .NET امکان می‌دهد کنترل بیشتری بر پارامترسازی داشته باشند و عملکرد برنامه‌های خود را بهبود بخشند. با وجود نیاز به تغییرات دستی در کد، مزایای آن از جمله کاهش مصرف منابع و افزایش کارایی، ارزش این تلاش را دارد.


مشاهده مطلب اصلی