انجام یک کوئری بر روی پایگاه داده، همیشه سطری را برگشت نمی دهد، بلکه گاهی هیچ سطری برگشت داده نمی شود. در این زمان مقدار تهی (پوچ) یا null برگشت داده می شود و برنامه نوسی می تواند مقدار پیش فرضی را تعیین کند تا اگر کوئری سطری را برگشت ندهد، پس مقدار پیش فرض جایگزین مقدار null شود.

در کد زیر یک کلاس موجودیت ساده برای کارمندان شناسانده ایم (تعریف کرده ایم) که دارای سه ویزگی (Property) به نام های EmployeeId و Name و YearsWorked است که همان ستون های جدول هستند. حال می خواهیم اگر مقدار null برای ستون YearsWorked برگشت داده شود، پس به گونه ای کوئری را آماده کنیم که شماره صفر را جایگزین مقدار null شود.

عملگر ?? در سی شارپ

عملگر ??، یک عملگر دودویی در سی شارپ است که null بودن را بررسی می کند. شیوه به کارگیری آن به گونه x ?? y است و بدین گونه است که اگر x مقداری پوچ (null) نباشد، پس مقدار x ارزیابی می شود وگرنه y ارزیابی خواهد شد. جای x باید نام متغیر یا گونه nullable (یا nulaable type) باشد و جای y نیز باید مقداری جز null باشد. در یک عبارت که چندین عملگر ?? باشد، اولیت از سمت راست به چپ است، بنابراین عبارت a ?? b ?? c را می توانیم به گونه (a ?? (b ?? c نیز بنویسیم. در کد زیر 

شناساندن (تعریف) گونه Nullable در سی شارپ

در کد زیر متغیری از گونه int را نوشته ایم که مقدار null را به آن داده ایم، بنابراین در شکل زیر می بینید که خطایی نشان داده می شود. این خطا برای این است که نمی توانیم مقدار null را به گونه int بدهیم، پس راهکار چیست؟ راهکار گذاشتن یک کاراکتر ? در پایان نام متغیر در زمان شناساندن (تعریف) آن متغیر است.

در کد زیر نخست متغیر x را به گونه ای نوشته ایم که می تواند مقدار null را نیز دریافت کند، زیرا ? در پایان نام گونه (در اینجا int) نوشته شده است. سپس دو بار، بار نخست مقدار ۵ و بار دیگر مقدار null را به متغیر داده این و سپس در شرط های if..else جدا و با کمک ویژگی HasValue بررسی کرده ایم که آیا متغیر مقداری (شماره ۵) دارد یا مقدارش تهی (پوچ یا null) است.

ولی در کد زیر عملگر ?? را در خط ۱۱ به کار برده ایم که بررسی می کند آیا مقدار متغیر رشته ای myName تهی است، اگر نباشد، پس سمت چپ عملگر، یعنی مقدار خود متغیر در متغیر تازه name ریخته می شود وگر، مقدار سمت راست عملگر، یعنی مقدار null در متغیر ریخته خواهد شد.

در آغاز این نوشته می بینید که ویژگی YearsWorked که از گونه int است، ولی چون عملگر ? در پایان int است، پس هم می تواند مقدار null یا مقدار شماره ای داشته باشد. توجه کنید که ویژگی YearsWorked همسان یک ستون در جدول است وشمار (تعداد) سال های کاری کارمند را در خود دارد، ولی شاید مقدار این ستون تهی (خالی) باشد، پس برای برخی سطرها این ستون مقدار null دارد ولی ما می خواهیم به جای null (پوچ) شماره صفر جایگزین شود.

در کد زیر بدون کمک دستورهای SQL و با کمک Linq-to-Entity، دو سطر را بدست متد ()Add به جدول افزوده این و سپس متد ()SaveChanges را فراخوانی کرده ایم تا تغییرات به پایگاه داده اعمال شوند. سپس در هر حلقه foreach همه سطرهای جدولی را می خوانیم که این جدول در کدهای سی شارپ، با کلاس موجودیت Employee نشاخته می شود و سپس در هر گام، هر سطر را نشان می دهیم.

در بَندهای (خط های) ۱۴ تا ۱۷، چون پیشروی دستور select از LINQ، عبارت new را به کار بردیم، پس می خواهیم تنها دو ویژگی از میان سه ویژگی کلاس موجودیت را به کار ببریم. به گفته دیگر می خواهیم به جای برگشت همه ستون های جدول، تنها دو ستون Name و YearsWorked را نشان دهیم، به گفته دیگر می خواهیم پرس و جوی SELECT  name, yearsworked FROM employee را پیاده سازی کنیم.

در بند ۱۶ به کمک عملگر ?? بررسی می شود که آیا مقدار e.YearsWorked برابر با null است یا نه؟ اگر null نباشد، پس مقدار خود ستون، یعنی مقدار بدست آمده از e.YearsWorked در متغیر YearsWorked ریخته می شود ولی اگر مقدار ستون null باشد، پس مقدار پیش فرض، یعنی شماره صفر در YearsWorked ریخته می شود.