تفاوت بین ()First و ()FirstOrDefault در LINQ

LINQ تکنولوژی جدیدی است که شرکت ماکروسافت با عرضه نسخه ی سوم Net. آن را معرفی نمود. در این مقاله تفاوت بین دستورات ()First و ()FirstOrDefault بررسی می شود.

 LINQ به یک قسمت مهم از برنامه نویسی تبدیل شده است اما برای بعضی از برنامه نویسان تازه کار که جدیدا کار با LINQ را شروع کرده اند ابهاماتی در درک سینتکس های مشابه هم، مانند ()First و ()FirstOrDefault و همچنین ()FirstOrDefault با ()Single و ()SingleOrDefault و غیره وجود دارد.

در اینجا به تفاوت میان ()First و ()FirstOrDefault خواهیم پرداخت.

الف. ()First

1.هنگامی که از دستور ()First در Linq استفاده می نماییم اگر رکوردی با شرط های موجود در قسمت Where پیدا نشود شما با Exception ای با عنوان زیر مواجه می شوید :

InvalidOperationException: Sequence contains no elements

 

    Var x=(from m in Member  
    Where m.UserName=’S000’  
    Select m.Name,m.Income,m.Year ).First()  

در جدول Member هیچ رکوردی وجود ندارد تا با عبارت m.username=s000 مطابقت داشته باشد(یعنی کاربری با نام کاربری s000 در این جدول وجود ندارد). بنابر این کوئری فوق خطای (Exception) زیر مواجه می شود :

InvalidOperationException: Sequence contains no elements

برای مدیریت کردن این خطا در #C می توان از دستور try Catch زیر استفاده نمود :

try  
{  
   Var x=(from m in Member  
   Where m.UserName=’S000’  
   Select m.Name,m.Income,m.Year  
   ).First()  
  
}  
catch (InvalidOperationException ex)  
{  
   Console.WriteLine(ex.Message);  
} 

2. زمانی که رکوردهای زیادی با عبارت شرط ما وجود دارد و شما تنها اولین رکورد از آنها را می خواهید می توان از ()First استفاده نمود.

برای مثال :
 

    Var x=(from m in Member  
    Where m.UserName=’s123’  
    Select m.Name,m.Income,m.Year).First()  

سپس به شما بر می گرداند :

3. ()First : اولین عنصر از آرایه را بر می گرداند.

4. ()First : هنگامی که عنصری وجود نداشت با Exception مواجه می شود.

 

ب. ()FirstOrDefault :

1. زمانی که از ()FirstOrDefault در Linq استفاده می نماییم اگر رکوردی با شرط های موجود در قسمت Where پیدا نشود مقدار پیش فرض (Null) برگردانده می شود :

    Var x=(from m in Member  
    Where m.UserName=’S000’  
    Select m.Name,m.Income,m.Year ).FirstOrDefault()  

در جدول Member هیچ رکوردی وجود ندارد تا با عبارت m.username=s000 مطابقت داشته باشد(یعنی کاربری با نام کاربری s000 در این جدول وجود ندارد). بنابر این کوئری فوق خطای (Exception) مواجه نشده بلکه مقدار پیش فرض Null برگردانده می شود.

اما اگر در #C از دستور زیر استفاده کنیم با Exception مواجه می شویم مانند :

Console.WriteLine(x.Name);

به دلبل وجود نداشتن رکورد با مشخصات موجود در کوئری Exception زیر برگردانده می شود.

“object reference not set to an instance of an object”

برای مدیریت کردن این خطا در #C می توان از دستور try Catch زیر استفاده نمود :

    try  
    {  
       Var x=(from m in Member  
       Where m.UserName=’S000’  
       Select m.Name,m.Income,m.Year ). FirstOrDefault ()  
       If(x!=null)  
       {  
           Console.WriteLine(x.Name);  
       }  
       else  
       {  
         Console.WriteLine("No Record Found");  
       }  
    }  
    catch (Exception ex)  
    {  
       Console.WriteLine(ex.Message);  
    }  

 

2. ()FirstOrDefault : اولین عنصر از آرایه را بر می گرداند.

3. ()FirstOrDefault : هنگامی که عنصری وجود نداشت با Exception مواجه نمی شود.