ฉันมีปีศาจในการค้นหาการเปรียบเทียบวิธีต่างๆในการค้นหารายการเดียวและเวลาที่ควรใช้แต่ละรายการ
ใครมีลิงค์ที่เปรียบเทียบสิ่งเหล่านี้ทั้งหมดหรือคำอธิบายสั้น ๆ ว่าทำไมคุณถึงใช้อันอื่น? ยังมีตัวดำเนินการอีกหรือไม่ที่ฉันไม่รู้จัก?
ขอบคุณ.
ฉันมีปีศาจในการค้นหาการเปรียบเทียบวิธีต่างๆในการค้นหารายการเดียวและเวลาที่ควรใช้แต่ละรายการ
ใครมีลิงค์ที่เปรียบเทียบสิ่งเหล่านี้ทั้งหมดหรือคำอธิบายสั้น ๆ ว่าทำไมคุณถึงใช้อันอื่น? ยังมีตัวดำเนินการอีกหรือไม่ที่ฉันไม่รู้จัก?
ขอบคุณ.
คำตอบ:
นี่คือภาพรวมของวิธีการต่างๆ:
ค้นหา () - เมื่อคุณต้องการรับรายการด้วยคีย์หลัก สิ่งนี้จะคืนค่าว่างหากไม่พบรายการ จะดูในบริบทก่อนที่จะไปที่ฐานข้อมูล (ตามที่ Yaron ชี้ให้เห็นในความคิดเห็น) ซึ่งอาจเป็นปัจจัยด้านประสิทธิภาพที่สำคัญหากคุณต้องการรับเอนทิตีเดียวกันหลายครั้งในขณะที่บริบทเดียวกันยังมีชีวิตอยู่
Single () - เมื่อคุณคาดว่าหนึ่งรายการจะถูกส่งกลับโดยแบบสอบถาม สิ่งนี้จะทำให้เกิดข้อยกเว้นหากแบบสอบถามไม่ส่งกลับรายการเดียว
SingleOrDefault () - เมื่อคุณคาดว่าจะส่งคืนค่าศูนย์หรือหนึ่งรายการโดยคิวรี (กล่าวคือคุณไม่แน่ใจว่ามีรายการที่มีคีย์ที่กำหนดอยู่หรือไม่) สิ่งนี้จะทำให้เกิดข้อยกเว้นหากแบบสอบถามไม่ส่งคืนศูนย์หรือหนึ่งรายการ
ขั้นแรก () - เมื่อคุณคาดหวังว่ารายการหนึ่งหรือหลายรายการจะถูกส่งคืนโดยแบบสอบถาม แต่คุณต้องการเข้าถึงรายการแรกในรหัสของคุณเท่านั้น (การสั่งซื้ออาจมีความสำคัญในการสืบค้นที่นี่) สิ่งนี้จะทำให้เกิดข้อยกเว้นหากแบบสอบถามไม่ส่งคืนอย่างน้อยหนึ่งรายการ
FirstOrDefault () - เมื่อคุณคาดว่าจะมีการส่งคืนรายการที่เป็นศูนย์หรือมากกว่าโดยแบบสอบถาม แต่คุณต้องการเข้าถึงรายการแรกในรหัสของคุณเท่านั้น (เช่นคุณไม่แน่ใจว่ามีรายการที่มีคีย์ที่กำหนดอยู่หรือไม่)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
หรือSingleOrDefault
จะค้นหา 2 ระเบียน (ขีด จำกัด 2) ในขณะที่First
หรือFirstOrDefault
จะค้นหา 1 (ขีด จำกัด 1)
FirstOrDefault
ฉันมักจะมีแนวโน้มที่จะใช้งาน หากคุณต้องการจู้จี้จุกจิกกับการแสดงจริง ๆ คุณควรใช้FirstOrDefault
ใน EF ภายใต้ฝาครอบSingleOrDefault
ใช้ด้านบน (2) ในแบบสอบถามเนื่องจากจำเป็นต้องตรวจสอบว่ามีแถวที่สองที่ตรงกับเกณฑ์หรือไม่และหากมีจะแสดงข้อยกเว้น โดยพื้นฐานแล้วSingleOrDefault
คุณกำลังบอกว่าคุณต้องการยกเว้นถ้าแบบสอบถามของคุณส่งคืนมากกว่า 1 ระเบียน
FirstOrDefault
และSingleOrDefault
มีนัยสำคัญหรือไม่? ฉันจะบอกว่าเป็นการเพิ่มประสิทธิภาพก่อนกำหนดในกรณีส่วนใหญ่
Single()
หรือSingleOrDefault()
เมื่อฉันกลับมาบางสิ่งบางอย่างที่มีควรอยู่เพียงอย่างใดอย่างหนึ่ง เหตุผลที่ฉันทำเช่นนั้นคือการตรวจหาจุดบกพร่องโดยการเขียนข้อความค้นหาไม่ดีซึ่งส่งคืนมากกว่าที่ควรจะเป็น อย่างน้อยก็ในใจของฉันสิ่งนี้จะช่วยให้ข้อมูลในระบบสอดคล้องกัน แน่นอนว่ามันช้ากว่า แต่ฉันเดาว่ามันช้ากว่าไม่มากและฉันยินดีจ่ายในราคานั้น
มันง่ายมาก: Single
ส่งคืนรายการเดียวและโยนข้อยกเว้นหากไม่มีหรือมากกว่าหนึ่งรายการ First
จะส่งคืนรายการแรกหรือโยนเมื่อไม่มีรายการ FirstOrDefault
จะส่งคืนรายการแรกหรือส่งคืนค่าเริ่มต้น (ซึ่งnull
ในกรณีที่ประเภทที่กำหนดเป็นประเภทอ้างอิง) เมื่อไม่มีรายการ
นี่คือลักษณะการทำงานที่ API ควรจะมี อย่างไรก็ตามโปรดทราบว่าการนำไปใช้งานอาจมีลักษณะการทำงานที่แตกต่างออกไป ในขณะที่ Entity Framework ปฏิบัติตามสิ่งนี้ O / RM อย่าง LLBLGen ก็สามารถกลับมาได้เช่นกันnull
เมื่อโทรFirst
ซึ่งเป็นสิ่งที่แปลกมาก นี่เป็นการตัดสินใจที่แปลกมาก (และดื้อรั้น) โดย IMO ของผู้ออกแบบ
Single
แสดงออกอย่างชัดเจนว่าคุณคาดหวังว่าผลลัพธ์จะมีองค์ประกอบเดียวเท่านั้น
ทั้งสี่วิธีแต่ละวิธีมีที่มาที่ไป แม้ว่าคุณจะมีเพียงสองการดำเนินการที่แตกต่างกัน
เวอร์ชัน xxxxOrDefault () เพิ่งเพิ่มใน "ฉันไม่ต้องการให้ผลลัพธ์ที่ว่างเปล่าถูกตั้งค่าเป็นสถานการณ์พิเศษ"
ในอีกด้านหนึ่งคุณสามารถแบ่งวิธีการเหล่านี้ด้วยตรรกะหลักเช่นนี้:
สำหรับรายละเอียดประสิทธิภาพบางอย่างโดยเฉพาะในกรณีที่สองคุณสามารถดูได้ที่นี่: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
นอกจากนี้ในกลุ่มแรกคุณสามารถกำหนดคิวรีที่ซับซ้อนได้ แต่ด้วยวิธีการค้นหา ()คุณสามารถระบุคีย์เอนทิตีสำหรับการค้นหาเท่านั้น
โดยปกติ Single ()และSingleOrDefault ()จะใช้กับตัวระบุที่ไม่ซ้ำกันเช่น ID ในขณะที่First ()หรือFirstOrDefault ()มักใช้สำหรับข้อความค้นหาที่อาจมีหลายผลลัพธ์ แต่คุณต้องการเฉพาะ"อันดับ 1"1"
Single ()หรือFirst ()จะทำให้เกิดข้อยกเว้นหากไม่มีการส่งคืนผลลัพธ์SingleOrDefault ()และFirstOrDefault () ตรวจจับข้อยกเว้นและส่งคืนค่า null หรือค่าเริ่มต้น (ResultDataType)