اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
کلاس شخص زیر را درنظر بگیرید
در اینجا با توجه به اینکه Name از نوع string است، خودبخود به فیلدی نالپذیر نگاشت خواهد شد و همچنین Age عددی نیز در سمت کدهای ما Nullable است، بنابراین خاصیت سن هم به فیلدی نالپذیر نگاشت میشود.
اگر تمام مراحل متداول ایجاد Context را طی کنیم، به نظر شما خروجی SQL عبارت زیر چه خواهد بود؟
در این عبارت، name به صورت یک متغیر ارسال شده است و نه یک مقدار ثابت (فرض کنید یک متد را تعریف کردهاید که name را به صورت پارامتر دریافت میکند).
خروجی SQL آن به نحو زیر است:
به عبارتی خروجی مورد انتظار name is null را تولید نکرده است و کوئری ما حداقل با SQL Server نتیجهای را به همراه نخواهد داشت. در مورد Age نیز به همین صورت است.
راه حل:
برای حالت Age، روش زیر خروجی age is null را تولید میکند:
و یا استفاده از object.Equals نیز مشکل را برطرف خواهد کرد:
برای حالت Name رشتهای میتوان از روش زیر استفاده کرد:
و یا روش کلیتر زیر نیز جواب میدهد:
کاری که در اینجا انجام شده استفاده از x.Name == null در حالت نال بودن name است. از این جهت که EF با کوئری ذیل به علت عدم استفاده از پارامتر برای معرفی مقداری نال، مشکلی ندارد:
public class Person { public int Id { get; set; } public string Name { get; set; } public int? Age { get; set; } }
اگر تمام مراحل متداول ایجاد Context را طی کنیم، به نظر شما خروجی SQL عبارت زیر چه خواهد بود؟
string name = null; var list1 = ctx.Users.Where(x => x.Name == name).ToList();
خروجی SQL آن به نحو زیر است:
SELECT [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], [Extent1].[Age] AS [Age] FROM [dbo].[People] AS [Extent1] WHERE [Extent1].[Name] = @p__linq__0 -- p__linq__0 (dbtype=String, size=-1, direction=Input) = null
راه حل:
برای حالت Age، روش زیر خروجی age is null را تولید میکند:
var list2 = ctx.Users.Where(x => !x.Age.HasValue).ToList();
int? age = null; var list2 = ctx.Users.Where(x => object.Equals(x.Age, age)).ToList();
var list1 = ctx.Users.Where(x => string.IsNullOrEmpty(x.Name)).ToList();
string name = null; var list1 = ctx.Users.Where(x => name == null ? x.Name == null : x.Name == name).ToList();
var list1 = ctx.Users.Where(x => x.Name == null).ToList();