کند اجرا شدن کوئری در Entity Framework و تغییر نوع پارامتر رشته‌ای در SQL نهایی

در Entity Framework بصورت پیش‌فرض متغیرهای string به پارامتری از نوع nvarchar(4000) در SQL تولید شده نهایی تبدیل می‌شود.

بعنوان مثال کوئری زیر را در نظر بگیرید:

using (var db = new SampleContext())
{
    var year = "1392";
    var query = from list in db.ListSend
                where list.AccountId == 2 && list.SendDate.Substring(1, 10) == year
                select list;
}

 

این کوئری به کد SQL زیر تبدیل خواهد شد:

exec sp_executesql N'SELECT 
	[Extent1].[AccountId] AS [AccountId],
	[Extent1].[SendDate] AS [SendDate]
	FROM [dbo].[ListSend] AS [Extent1]
	WHERE ([Extent1].[AccountId] = @p__linq__0) AND ((SUBSTRING([Extent1].[SendDate], 0 + 1, 4)) = @p__linq__1)
,N'@p__linq__0 int,@p__linq__1 nvarchar(4000)',@p__linq__0=2,@p__linq__1='1392'

اجرای این کوئری بر روی داده‌های با تعداد بالا گاهی تا حدود 30 ثانیه طول می‌کشد! علت اصلی این کند اجرا شدن به تبدیل نوع رشته‌ای متغیر SendDate به nvarchar برمی‌گردد. برای رفع این مشکل اگر نوع پارامتر SendDate به نوع varchar(8000) تبدیل شود این کوئری بدون تأخیر اجرا می‌شود.

 

تبدیل نوع پارامتر رشته‌ای در Entity Framework

بمنظور اینکه متغیر رشته‌ای در کوئری Entity Framework به نوع varchar(8000) تبدیل شود از کلاس EntityFunctions که در فضای نام  System.Data.Objects قرار دارد به شکل زیر استفاده می‌کنیم:

EntityFunctions.AsNonUnicode(year)

 

در نهایت کد ما به شکل زیر خواهد بود:

using (var db = new SampleContext())
{
    var year = "1392";
    var query = from list in db.ListSend
                where list.AccountId == 2 && list.SendDate.Substring(1, 10) == EntityFunctions.AsNonUnicode(year)
                select list;
}

 

خروجی SQL کوئری فوق بدین شکل خواهد بود:

exec sp_executesql N'SELECT 
	[Extent1].[AccountId] AS [AccountId],
	[Extent1].[SendDate] AS [SendDate]
	FROM [dbo].[ListSend] AS [Extent1]
	WHERE ([Extent1].[AccountId] = @p__linq__0) AND ((SUBSTRING([Extent1].[SendDate], 0 + 1, 4)) = @p__linq__1)
,N'@p__linq__0 int,@p__linq__1 varchar(8000)',@p__linq__0=2,@p__linq__1='1392'

 

نظرات (1) -

ارسال نظر

Loading