Single , SingleOrDefault , First , FirstOrDefault , Last , LastOrDefault in LINQ
في متابعة الحديث عن تقنية الـ LINQ اليوم درسنا راح نتكلم فيه عن مجموعة من الدوال , مهمة هذه الدوال اختيار عنصر واحد فقط سواء ان يكون العنصر واحد او من بين مجموعة عناصر .. كيف !!
Single
هذه الدالة تعني شي واحد عندما نستخدمها في الاستعلام الخاص بـ LINQ سوف نستخدمها لطلب نتيجة واحده فقط , واهم شيئ نحن نكون على علم بأنك النتيجة سوف تكون واحده فقط.
لنأخد المثال التالي:
int[] Numbers = { 1, 2, 3, 4, 5, 6 };
var Single = (from r in Numbers
where r > 5
select r).Single();
Label_Result.Text = Single.ToString();النتيجة:
6
How the example work
بكل بساطة اخواني انا ذكرت ان عند استخدام هذه الدالة نكون على علم بأن النتيجة سوف تكون واحدة فقط , وكما في المثال النتيجة 6 من المصفوفة .
SingleOrDefault
بصراحة لا تختلف عن الدالة Single لكن توجد فائدة جميلة في هذه الدالة هي عندما لا توجد نتيجة للأسترجاع ترجع قيمة للدلالة على انه لا يوجد قيمة وهذا شيئ مفيد عندما نريد وضع شرط للتحقق مثلا من وجود البيانات وهكذا.
مثلا اذا كانت البيانات من نوع int راح يرجع لنا 0 واذا كان من نوع bool راح يرجع false , هكذا تمت مساعدتنا للتحقق
لنأخد مثال:
int[] Numbers = { 1, 2, 3, 4, 5, 6, 7 };
var Single = (from r in Numbers
where r > 7
select r).SingleOrDefault();
if (Single == 0)
{
Label_Result.Text = "No Result Found !";
}
else
{
Label_Result.Text = Single.ToString();
}مثلا اذا كانت المصفوفة من نوع string نستطيع استخدام الـ null في التحقق
مثال:
string[] Names = { "ali", "hassan", "Noor" };
var SD = (from r in Names
where r.StartsWith("m")
select r).SingleOrDefault();
if (SD == null)
{
Label_Result.Text = "No Result found";
}
else {
Label_Result.Text = SD.ToString();
}النتيجة:
طبعا راح يعطينا رسالة الخطأ لان لايوجد أي نتيجة مطابقة.
How the example work
المثال بسيط عملت شرط انه يبحث عن الاسماء التي تبدأ بحرف m ومن الواضح ان المصفوفة لا تحتوي على اسماء تبدأ بهذا الحرف,النتيجة راح تكون رسالة الخطأ.
First
هذه الدالة تختلف عن السابقة حيث انها تتعامل مع اكثر من نتيجة لكن سوف يتم عرض نتيجة واحده فقط, لنوضح ذلك بمثال
int[] Numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var First = (from r in Numbers
where r > 6
select r).First();
Label_Result.Text = First.ToString();النتيجة:
7
How the Example work
لو نلاحظ ان في الشرط نريد الارقام التي تكون اكبر من الرقم 6 ويوجد في المصفوفة 4 ارقام اكبر منه لكن هنا يأتي دور الدالة First حيث انها اخذت اول نتيجة من الارقام التي تكون اكبر من الرقم 6.
FirstOrDefault
هذه الدالة لايوجد بها أي اختلاف عن الـ First وايضا ترجع لنا قيمة لتساعدنا على التحقق, على سبيل المثال:
int[] Numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var First = (from r in Numbers
where r > 10
select r).FirstOrDefault();
if (First == 0)
{
Label_Result.Text = "No Result found !";
}
else
{
Label_Result.Text = First.ToString();
}النتيجة:
راح يطبع رسالة الخطأ لان لايوجد نتيجة, ومثل ما ذكرت انها ترجع قيمة للتحقق
وبما ان المصفوفة من نوع int راح يرجع قيمة 0 للتحقق ,, وهكذا
Last , LastOrDefault
الدالتين مثل First , FirstOrDefault بس بشكل معكوس حيث ان الدالة First اذا وجد اكثر من ناتج تأخذ اول ناتج دالة الـ Last راح يكون الناتج اخر عدد, و LastOrDefaultتعمل مثل FirstOrDefault وايضا بشكل معكوس .
ملاحظات عامة:
- ذكرت ان استخدام دالتي Single,SingleOrDefault عندما نكون على علم ان النتيجة سوف تكون واحدة فقط
- يفضل استخدام LastOrDefault, FirstOrDefaulr , SingleOrDefaul لان يوجد طريقة للتحقق وهذا يقلل من حدوث الخطأ
----------
في النهاية اخواني اتوقع ان الدوال سهلة بس تحتاج الى تركيز واهم شي الانتباه عند الاستخدام لمنع حدوث الاخطاء في الموقع