c# شرح - متى يتم استخدام.First ومتى يجب استخدام.FirstOrDefault مع LINQ؟




tutorial sql (13)

أول:

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

FirstOrDefault:

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

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

لقد بحثت في جميع أنحاء ولم أجد بالفعل إجابة واضحة حول متى تريد استخدام .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);
    

someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)

أي واحد لاستخدام؟ يجب أن يتم تحديده من خلال منطق الأعمال ، وليس الخوف من الاستثناء / فشل البرنامج.

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

الشفرة:

var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()

أود أن أرى تعليقات الآخرين حول هذا الموضوع.


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

  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 ()؛


بادئ ذي بدء ، Take هي طريقة مختلفة تماما. تقوم بإرجاع IEnumerable<T> وليس T واحد ، لذلك خارجاً.

بين First و FirstOrDefault ، يجب عليك استخدام First عندما تكون متأكدًا من وجود عنصر وإذا لم يكن موجودًا ، فهناك خطأ.

بالمناسبة ، إذا كان التسلسل الخاص بك يحتوي على عناصر default(T) (على سبيل المثال ، null ) وتحتاج إلى التمييز بين أن تكون فارغة والعنصر الأول null ، فلا يمكنك استخدام 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: [email protected]

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

هناك سجلات متعددة حيث FName == "راهول". يجب أن يعود السجل الأول.
الرقم: 7 الاسم الأول: راهول الاسم الأخير: شارما البريد الإلكتروني: [email protected]

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: [email protected]

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

هناك سجلات متعددة حيث FName == "راهول". يجب أن يعود السجل الأول.
الرقم: 7 الاسم الأول: راهول الاسم الأخير: شارما البريد الإلكتروني: [email protected]

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

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

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


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

لذا إذا كنت مستعدًا وراغبًا في التعامل مع استثناء محتمل ، فإن .First() أمر جيد. إذا كنت تفضل التحقق من قيمة الإرجاع لـ! = null على أي حال ، فإن .FirstOrDefault() هو خيارك الأفضل.

لكن أعتقد أنه جزء من تفضيل شخصي أيضًا. استخدم أيهما أكثر منطقية بالنسبة لك ويناسب أسلوب الترميز بشكل أفضل.


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

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


أول()

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

FirstOrDefault ()

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


هناك اختلاف آخر هو ملاحظة أنه إذا كنت تقوم بتصحيح أحد التطبيقات في بيئة الإنتاج ، فقد لا تتمكن من الوصول إلى أرقام الأسطر ، بحيث يتم تحديد العبارة .First() في أسلوب معين والتي قد تكون الاستثناء صعبة.

لن تتضمن رسالة الاستثناء أيضًا أي تعبيرات Lambda التي قد تكون استخدمتها والتي من شأنها أن تجعل أي مشكلة أصعب للتصحيح.

لهذا السبب دائمًا ما أستخدم FirstOrDefault() على الرغم من أنني أعرف أن الإدخال الفارغ سيشكل حالة استثنائية.

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}

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

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

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


أود أن استخدم First() عندما أعرف أو أتوقع أن يحتوي التسلسل على عنصر واحد على الأقل. بمعنى آخر ، عندما يكون التتابع غير عادي ، يكون التسلسل فارغًا.

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

وأخيراً ، يكون الفرق بين First() و Take() هو أن First() بإرجاع العنصر نفسه ، بينما تقوم Take() بإرجاع سلسلة من العناصر التي تحتوي على عنصر واحد بالضبط. (إذا قمت بتمرير 1 كمعامل).


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

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






c# .net linq