[.net] LINQ: وقت استخدام SingleOrDefault مقابل FirstOrDefault () مع معايير التصفية


Answers

إذا كانت مجموعة النتائج الخاصة بك تقوم بإرجاع 0 سجل:

  • إرجاع SingleOrDefault القيمة الافتراضية للنوع (على سبيل المثال الافتراضي لـ int 0)
  • إرجاع FirstOrDefault القيمة الافتراضية للنوع

إذا قمت بتعيين النتيجة بإرجاع سجل واحد:

  • SingleOrDefault بإرجاع هذا السجل
  • FirstOrDefault بإرجاع هذا السجل

إذا كانت مجموعة النتائج الخاصة بك تقوم بإرجاع العديد من السجلات:

  • SingleOrDefault يطرح استثناء
  • إرجاع FirstOrDefault السجل الأول

استنتاج:

إذا كنت تريد طرح استثناء إذا كانت مجموعة النتائج تحتوي على العديد من السجلات ، استخدم SingleOrDefault .

إذا كنت تريد دومًا 1 سجل بغض النظر عن ما FirstOrDefault مجموعة النتائج ، استخدم FirstOrDefault

Question

النظر في أساليب ملحق IEnumerable SingleOrDefault() و FirstOrDefault()

مستندات MSDN التي SingleOrDefault :

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

بينما FirstOrDefault من MSDN (يفترض عند استخدام OrderBy() أو OrderByDescending() أو لا شيء على الإطلاق) ،

إرجاع العنصر الأول من التسلسل

ضع في اعتبارك مجموعة من الاستعلامات على سبيل المثال ، وليس من الواضح دائمًا متى تستخدم هاتين الطريقتين:

var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE

var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?

var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?

سؤال

ما هي الاصطلاحات التي تتبعها أو تقترحها عند اتخاذ قرار باستخدام SingleOrDefault() و FirstOrDefault() في استعلامات LINQ الخاصة بك؟




لم يذكر أحد أن FirstOrDefault المترجمة في SQL يقوم بأعلى سجل 1 ، و SingleOrDefault لا TOP 2 ، لأنه يحتاج إلى معرفة وجود أكثر من سجل واحد.




SingleOrDefault: أنت تقول أن "على الأكثر" هناك عنصر واحد يطابق الاستعلام أو الافتراضي FirstOrDefault: أنت تقول أن هناك عنصر واحد "على الأقل" يطابق الاستعلام أو الافتراضي

قل ذلك بصوت مرتفع في المرة القادمة التي تحتاج إلى الاختيار ، ومن المرجح أن تختار بحكمة. :)




من أجل LINQ -> SQL:

SingleOrDefault

  • سيقوم بإنشاء استعلام مثل "حدد * من المستخدمين حيث userid = 1"
  • حدد السجل المطابق ، واستبعاد الاستثناء في حالة العثور على أكثر من سجل واحد
  • استخدمه إذا كنت تجلب البيانات استنادًا إلى عمود المفتاح الأساسي / الفريد

FirstOrDefault

  • سيؤدي إلى إنشاء طلب بحث مثل "حدد أعلى 1 * من المستخدمين حيث userid = 1"
  • حدد الصفوف المطابقة الأولى
  • استخدم إذا كنت تجلب البيانات استنادًا إلى عمود المفتاح غير الأساسي / الفريد



شيء واحد هو غاب في الردود ....

في حالة وجود عدة نتائج ، يمكن لـ FirstOrDefault بدون طلب بواسطة إرجاع نتائج مختلفة استنادًا إلى أي إستراتيجية الفهرس التي تم استخدامها من قبل الملقم.

شخصيا لا أستطيع أن أرى FirstOrDefault في رمز لأنه يقول لي المطور لم يهتم بالنتائج. مع أمر على الرغم من أنه يمكن أن يكون مفيدا كوسيلة لفرض أحدث / أقرب. لقد قمت بتصحيح الكثير من المشكلات التي تسببها المطورين المهملة باستخدام FirstOrDefault.




كلاهما عامل العناصر ويتم استخدامها لتحديد عنصر واحد من تسلسل. لكن هناك اختلاف بسيط بينهما. عامل SingleOrDefault () طرح استثناء إذا تمت استيفاء أكثر من عناصر الشرط حيث لا يتم طرح FirstOrDefault () أي استثناء لنفسه. هنا هو المثال.

List<int> items = new List<int>() {9,10,9};
//Returns the first element of a sequence after satisfied the condition more than one elements
int result1 = items.Where(item => item == 9).FirstOrDefault();
//Throw the exception after satisfied the condition more than one elements
int result3 = items.Where(item => item == 9).SingleOrDefault();



Related