[C#] متى يتم استخدام .First ومتى يجب استخدام .FirstOrDefault مع LINQ؟


Answers

.First سوف يرمي استثناء عند عدم وجود نتائج. لن يؤدي .FirstOrDefault إلى إرجاع أي (أنواع مرجعية) فارغة أو القيمة الافتراضية لنوع القيمة. (على سبيل المثال ، مثل 0 لـ int.) السؤال هنا ليس عندما تريد النوع الافتراضي ، ولكن المزيد: هل أنت على استعداد للتعامل مع استثناء أو التعامل مع قيمة افتراضية؟ نظرًا لأن الاستثناءات يجب أن تكون استثنائية ، يُفضل FirstOrDefault عندما تكون غير متأكد من أنك ستحصل على نتائج من استفسارك. عندما تكون هناك منطقية البيانات ، يمكن اعتبار معالجة الاستثناءات.

Skip() و Take() عادةً عند إعداد ترحيل الصفحات في النتائج. (مثل عرض النتائج العشرة الأولى ، والنتائج العشرة التالية في الصفحة التالية ، إلخ.)

أتمنى أن يساعدك هذا.

Question

لقد بحثت في جميع أنحاء ولم أجد بالفعل إجابة واضحة حول متى تريد استخدام .First ومتى تريد استخدام .FirstOrDefault مع LINQ.

  • متى تريد استخدام .First ؟ فقط عندما تريد التقاط الاستثناء في حالة عدم وجود نتائج حيث تم إرجاعها؟

    var result = List.Where(x => x == "foo").First();
    
  • متى تريد استخدام .FirstOrDefault ؟ عندما تريد دائما النوع الافتراضي إذا لم يكن هناك نتيجة؟

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • ولهذه المسألة ، ماذا عن خذ؟

    var result = List.Where(x => x == "foo").Take(1);
    



أول:

  • إرجاع العنصر الأول من التسلسل
  • يلقي استثناء: لا توجد عناصر في النتيجة
  • الاستخدام عندما: عند توقع وجود أكثر من عنصر واحد وتريد أول عنصر فقط

FirstOrDefault:

  • إرجاع العنصر الأول في تسلسل ، أو قيمة افتراضية في حالة عدم العثور على أي عنصر
  • يلقي استثناء: فقط إذا كان المصدر فارغًا
  • الاستخدام عندما: عند توقع وجود أكثر من عنصر واحد وتريد أول عنصر فقط. كما أنه من الجيد أن تكون النتيجة فارغة

من: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/




لقد عثرت على موقع ويب يقوم بعمليات البحث لشرح الحاجة إلى FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
إذا لم تكن هناك نتائج لاستعلام ، وتريد الاتصال بـ First () أو Single () للحصول على صف واحد ... ستحصل على استثناء "Sequence contains no elements".

إخلاء المسؤولية: لم أستخدم أبداً LINQ ، لذا أعتذر إذا كان هذا بعيداً عن العلامة.




أول()

عندما تعرف أن النتيجة تحتوي على أكثر من عنصر واحد متوقع ويجب عليك فقط أول عنصر في التسلسل.

FirstOrDefault ()

يكون FirstOrDefault () مثل First () باستثناء أنه إذا لم يتطابق أي عنصر مع الشرط المحدد منه ، فإنه يعيد القيمة الافتراضية للنوع الأساسي لمجموعة عامة. لا يؤدي إلى إلغاء InvalidOperationException إذا تم العثور على أي عنصر. لكن جمع عنصر أو تسلسل هو فارغ من يلقي استثناء.




ينتمي هذا النوع من الدالة إلى عوامل العناصر. يتم تعريف بعض مشغلي العناصر المفيدة أدناه.

  1. أولا / FirstOrDefault
  2. آخر / LastOrDefault
  3. واحد / SingleOrDefault

نستخدم عوامل العناصر عندما نحتاج إلى اختيار عنصر واحد من تسلسل يستند إلى شرط معين. هنا هو المثال.

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9,2,10};

يعيد عامل التشغيل الأول () العنصر الأول من التسلسل بعد استيفاء الشرط. إذا لم يتم العثور على أي عنصر ، فسيتم ذلك من خلال استثناء.

int int = items.Where (item => item == 2) .First ()؛

إرجاع عامل FirstOrDefault () العنصر الأول في تسلسل بعد استيفاء الشرط. إذا لم يتم العثور على أي عنصر ، فسيعرض قيمة افتراضية من هذا النوع.

int result1 = items.Where (item => item == 2) .FirstOrDefault ()؛




linq العديد من الطرق لتنفيذ استعلام واحد بسيط على مجموعات ، فقط نكتب الصلات في SQL ، يمكن تطبيق مرشح الأول أو الأخير تبعا للحاجة والضرورة.

في ما يلي مثال يمكننا من خلاله العثور على عنصر له معرف في مجموعة. لإضافة المزيد على هذا ، FirstOrDefault الأساليب First ، FirstOrDefault ، بشكل مثالي نفس عندما تحتوي مجموعة على سجل واحد على الأقل. ومع ذلك ، إذا كان من الأفضل أن تكون المجموعة فارغة. سيتم First إرجاع استثناء ولكن FirstOrDefault null أو افتراضي. على سبيل المثال ، سيتم إرجاع int 0. لذلك ، على الرغم من أن استخدام مثل هذا هو تفضيل شخصي ، إلا أنه من الأفضل استخدام FirstOrDefault لتجنب الاستثناء.




أول()

  1. إرجاع العنصر الأول من التسلسل.
  2. انها رمي خطأ عندما لا يوجد عنصر في النتيجة أو مصدر فارغ.
  3. يجب عليك استخدامه ، إذا كان هناك أكثر من عنصر واحد متوقع وتريد العنصر الأول فقط.

FirstOrDefault ()

  1. إرجاع العنصر الأول في تسلسل ، أو قيمة افتراضية في حالة عدم العثور على أي عنصر.
  2. فإنه يرمي خطأ فقط إذا كان المصدر فارغًا.
  3. يجب عليك استخدامه ، إذا كان هناك أكثر من عنصر واحد متوقع وتريد العنصر الأول فقط. جيد أيضا إذا كانت النتيجة فارغة.

لدينا جدول UserInfos ، والتي تحتوي على بعض السجلات كما هو موضح أدناه. على أساس هذا الجدول أدناه لقد خلقت مثال ...

كيفية استخدام First ()

var result = dc.UserInfos.First(x => x.ID == 1);

يوجد سجل واحد فقط حيث ID == 1. يجب إرجاع هذا السجل
الرقم: 1 الاسم الأول: Manish اسم العائلة: Dubey Email: xyz@xyz.com

var result = dc.UserInfos.First(x => x.FName == "Rahul");   

هناك سجلات متعددة حيث FName == "راهول". يجب أن يعود السجل الأول.
الرقم: 7 الاسم الأول: راهول الاسم الأخير: شارما البريد الإلكتروني: xyz1@xyz.com

var result = dc.UserInfos.First(x => x.ID ==13);

لا يوجد سجل مع معرف == 13. يجب أن يحدث خطأ.
InvalidOperationException: التسلسل لا يحتوي على عناصر

كيفية استخدام FirstOrDefault ()

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);

يوجد سجل واحد فقط حيث ID == 1. يجب إرجاع هذا السجل
الرقم: 1 الاسم الأول: Manish اسم العائلة: Dubey Email: xyz@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");

هناك سجلات متعددة حيث FName == "راهول". يجب أن يعود السجل الأول.
الرقم: 7 الاسم الأول: راهول الاسم الأخير: شارما البريد الإلكتروني: xyz1@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);

لا يوجد سجل بالمعرف == 13. قيمة الإرجاع خالية

نأمل أن تساعدك على فهم متى تستخدم First() أو FirstOrDefault() .