LINQ: เมื่อใดที่จะใช้ SingleOrDefault vs. FirstOrDefault () กับเกณฑ์การกรอง


506

พิจารณาวิธีการขยาย 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 ของคุณ

คำตอบ:


466

เมื่อใดก็ตามที่คุณใช้SingleOrDefaultคุณรัฐอย่างชัดเจนว่าแบบสอบถามจะส่งผลให้ในที่สุดเดียวผล ในทางกลับกันเมื่อFirstOrDefaultมีการใช้งานแบบสอบถามสามารถส่งคืนผลลัพธ์จำนวนเท่าใดก็ได้ แต่คุณระบุว่าคุณต้องการเพียงผลลัพธ์แรกเท่านั้น

ฉันพบว่าซีแมนทิกส์แตกต่างกันมากและใช้ความเหมาะสมนั้นขึ้นอยู่กับผลลัพธ์ที่คาดไว้จะช่วยให้อ่านง่ายขึ้น


164
ข้อแตกต่างที่สำคัญมากคือถ้าคุณใช้ SingleOrDefault ในลำดับที่มีมากกว่าหนึ่งองค์ประกอบมันจะส่งข้อยกเว้น
Kamran Bigdely

17
@kami ถ้ามันไม่ได้มีข้อยกเว้นมันจะเหมือนกับ FirstOrDefault ข้อยกเว้นคือสิ่งที่ทำให้ SingleOrDefault จุดดีนำมันขึ้นมาและวางตะปูบนโลงศพของความแตกต่าง
Fabio S.

17
ฉันต้องบอกว่าจากการใช้งานอย่างชาญฉลาด FirstOrDefault ทำงานได้เร็วกว่า SingleOrDefault ประมาณ 10 เท่าโดยใช้ List <MyClass> ขององค์ประกอบ 9,000,000 คลาสมี 2 จำนวนเต็มและ Func มีการค้นหาจำนวนเต็มสองตัวนี้ การค้นหา 200 ครั้งในลูปใช้เวลา 22 วินาทีใน var v = list.SingleOrDefault (x => x.Id1 == i && x.Id2 == i); และ var v = list.FirstOrDefault (x => x.Id1 == i && x.Id2 == i); ประมาณ 3 วินาที
เฉิน

6
@BitsandBytesHandyman หาก SignleOrDefault ไม่ส่งข้อยกเว้นเมื่อลำดับมีมากกว่าหนึ่งรายการมันจะไม่ทำงานเหมือนกับ FirstOrDefault FirstOrDefault ส่งคืนไอเท็มแรกหรือ null หากลำดับว่างเปล่า SingleOrDefault ควรส่งคืนเฉพาะไอเท็มหรือ null ถ้าลำดับว่างเปล่าหรือถ้ามันมีมากกว่าหนึ่งไอเท็มโดยไม่ต้องส่งข้อยกเว้นเลย
Thanasis Ioannidis

2
@RSW ใช่ฉันรู้แล้ว อ่านความคิดเห็นของฉันอย่างถี่ถ้วนฉันกำลังพูดว่า SingleOrDefault ควรทำอะไรไม่ใช่สิ่งที่ทำ แต่แน่นอนสิ่งที่ควรทำเป็นเรื่องส่วนตัวมาก สำหรับฉันรูปแบบ "SomethingOrDefault" หมายถึง: รับค่าของ "Something" หาก "Something" ล้มเหลวในการส่งคืนค่าให้ส่งคืนค่าเริ่มต้น ซึ่งหมายความว่าควรจะส่งคืนค่าเริ่มต้นแม้ในกรณีที่ "Something" ส่งผลให้เกิดข้อยกเว้น ดังนั้นที่เดียวจะโยนข้อยกเว้น SingleOrDefault ควรคืนค่าเริ่มต้นในมุมมองของฉัน
Thanasis Ioannidis

585

หากชุดผลลัพธ์ของคุณส่งกลับ 0 รายการ:

  • SingleOrDefault ส่งคืนค่าเริ่มต้นสำหรับประเภท (เช่นค่าเริ่มต้นสำหรับ int คือ 0)
  • FirstOrDefault ส่งคืนค่าเริ่มต้นสำหรับประเภท

หากชุดผลลัพธ์คุณส่งคืน 1 บันทึก:

  • SingleOrDefault ส่งกลับระเบียนนั้น
  • FirstOrDefault ส่งกลับระเบียนนั้น

หากชุดผลลัพธ์ของคุณส่งกลับหลายรายการ:

  • SingleOrDefault โยนข้อยกเว้น
  • FirstOrDefault ส่งกลับระเบียนแรก

สรุป:

SingleOrDefaultหากคุณต้องการให้มีการยกเว้นจะถูกโยนถ้าผลการตั้งค่ามีหลายระเบียนการใช้งาน

หากคุณต้องการบันทึก 1 ชุดไม่ว่าจะใช้ชุดผลลัพธ์แบบใดให้ใช้ FirstOrDefault


6
ฉันอยากจะแนะนำว่ามันยากที่จะต้องการการยกเว้นจริง ๆ ดังนั้น FirstOrDefault ส่วนใหญ่จะเป็นที่ต้องการ ฉันรู้ว่ากรณีจะมีอยู่เพียงนั้นมักจะไม่ imo
MikeKulls

FirstOrDefaultถูกส่งกลับระเบียนแรกหมายถึงระเบียนใหม่ (ล่าสุด) / ระเบียนเก่า (แรก) คุณสามารถชี้แจงฉันได้ไหม
Duk

@ ดุ๊กมันขึ้นอยู่กับว่าคุณเรียงลำดับเร็กคอร์ดอย่างไร คุณสามารถใช้ OrderBy () หรือ OrderByDescending () ฯลฯ ก่อนที่จะโทร FirstOrDefault ดูตัวอย่างรหัสของ OP
กาน

5
ฉันชอบคำตอบนี้ด้วย โดยเฉพาะอย่างยิ่งเนื่องจากมีบางโอกาสที่คุณต้องการให้เกิดข้อยกเว้นเนื่องจากคุณตั้งใจจะจัดการกับกรณีที่หายากนั้นอย่างเหมาะสมที่อื่นแทนที่จะเป็นเพียงแค่แกล้งทำเป็นว่ามันไม่เกิดขึ้น เมื่อคุณต้องการข้อยกเว้นที่คุณพูดอย่างชัดเจนและบังคับให้ผู้อื่นจัดการเพียงแค่ห่อหุ้มทำให้ระบบโดยรวมมีประสิทธิภาพมากขึ้น
Francis Rodgers

มีการระบุไว้อย่างชัดเจนเพื่อให้สามารถเข้าใจได้ง่าย
Nirav Vasoya

243

นั่นคือ

  • ความแตกต่างทางความหมาย
  • ความแตกต่างของประสิทธิภาพ

ระหว่างสอง

ความแตกต่างทางความหมาย:

  • FirstOrDefault ส่งคืนรายการแรกที่อาจเกิดขึ้นหลายรายการ (หรือค่าเริ่มต้นหากไม่มี)
  • SingleOrDefaultสมมติว่ามีรายการเดียวและส่งคืน (หรือค่าเริ่มต้นหากไม่มี) หลายรายการเป็นการละเมิดสัญญายกเว้นจะถูกโยน

ความแตกต่างของประสิทธิภาพ

  • FirstOrDefaultโดยทั่วไปจะเร็วกว่าจะทำซ้ำจนกว่าจะพบองค์ประกอบและจะต้องวนซ้ำทั้งหมดเมื่อไม่พบองค์ประกอบ ในหลายกรณีมีความเป็นไปได้สูงที่จะค้นหารายการ

  • SingleOrDefaultจำเป็นต้องตรวจสอบว่ามีองค์ประกอบเดียวเท่านั้นหรือไม่ดังนั้นจึงวนซ้ำทั้งจำนวนเสมอ เพื่อให้แม่นยำมันจะวนซ้ำจนกว่าจะพบองค์ประกอบที่สองและส่งข้อยกเว้น แต่ในกรณีส่วนใหญ่ไม่มีองค์ประกอบที่สอง

ข้อสรุป

  • ใช้FirstOrDefaultถ้าคุณไม่สนใจว่ามีกี่รายการหรือเมื่อคุณไม่สามารถตรวจสอบเอกลักษณ์ได้ (เช่นในคอลเลกชันขนาดใหญ่มาก) เมื่อคุณตรวจสอบความเป็นเอกลักษณ์ในการเพิ่มรายการลงในคอลเลกชันมันอาจแพงเกินไปที่จะตรวจสอบอีกครั้งเมื่อค้นหารายการเหล่านั้น

  • ใช้SingleOrDefaultหากคุณไม่ต้องกังวลเกี่ยวกับประสิทธิภาพมากเกินไปและต้องการตรวจสอบให้แน่ใจว่าสมมติฐานของรายการเดียวนั้นชัดเจนต่อผู้อ่านและตรวจสอบที่รันไทม์

ในทางปฏิบัติคุณใช้First/ FirstOrDefaultบ่อยครั้งแม้ในกรณีที่คุณถือว่าเป็นรายการเดียวเพื่อปรับปรุงประสิทธิภาพ คุณควรจำไว้ว่าSingle/ SingleOrDefaultสามารถปรับปรุงความสามารถในการอ่านได้ (เพราะมันระบุข้อสันนิษฐานของรายการเดียว) และความเสถียร (เพราะมันตรวจสอบ) และใช้มันอย่างเหมาะสม


16
+1 "หรือเมื่อคุณไม่สามารถตรวจสอบเอกลักษณ์ได้ (เช่นในคอลเล็กชันขนาดใหญ่มาก)" . ฉันกำลังมองหาสิ่งนี้ ฉันจะเพิ่มการบังคับใช้เอกลักษณ์เมื่อแทรกหรือ / และโดยการออกแบบแทนการทำแบบสอบถาม!
Nawaz

ฉันสามารถจินตนาการว่าSingleOrDefaultจะทำซ้ำวัตถุจำนวนมากเมื่อใช้ Linq กับวัตถุ แต่ไม่SingleOrDefaultจำเป็นต้องวนซ้ำเกิน 2 รายการหาก Linq กำลังพูดคุยกับฐานข้อมูลตัวอย่างเช่น เพียงแค่สงสัย ..
Memet Olsen

3
@memetolsen พิจารณาการปล่อยรหัสสำหรับทั้งสองด้วย LINQ ไปยัง SQL - FirstOrDefault ใช้อันดับ 1 SingleOrDefault ใช้อันดับ 2
Jim Wooley

@ JimWooley ฉันคิดว่าฉันเข้าใจผิดคำว่า 'นับได้' ผมคิดว่าสเตฟานหมาย C Enumerable#
Memet Olsen

1
@emetolsen ถูกต้องในแง่ของคำตอบดั้งเดิมความคิดเห็นของคุณอ้างอิงถึงฐานข้อมูลดังนั้นฉันจึงเสนอสิ่งที่เกิดขึ้นจากผู้ให้บริการ ในขณะที่รหัส. Net ทำซ้ำเฉพาะค่ามากกว่า 2 ค่าฐานข้อมูลจะทำการเยี่ยมชมเรคคอร์ดจำนวนมากเท่าที่จำเป็นจนกว่าจะถึงอันดับที่สองที่ตรงกับเกณฑ์
Jim Wooley

76

ไม่มีใครพูดถึงว่า FirstOrDefault ที่แปลใน SQL ทำบันทึก 1 อันดับแรกและ SingleOrDefault ทำอันดับ 2 เพราะต้องรู้ว่ามีมากกว่า 1 บันทึก


3
เมื่อฉันรัน SingleOrDefault ผ่าน LinqPad และ VS ฉันไม่เคยได้รับ SELECT TOP 2 กับ FirstOrDefault ฉันสามารถเลือก SELECT 1 ได้ แต่เท่าที่ฉันสามารถบอกได้ว่าคุณไม่ได้รับ SELECT TOP 2
Jamie R Rytlewski

เฮ้ฉันเคยลองใช้ linqpad แล้วและแบบสอบถาม sql ทำให้ฉันกลัวเพราะมันดึงข้อมูลแถวทั้งหมดได้อย่างสมบูรณ์ ฉันไม่แน่ใจว่าสิ่งนี้จะเกิดขึ้นได้อย่างไร?
AnyOne

1
ขึ้นอยู่กับผู้ให้บริการ LINQ ที่ใช้ทั้งหมด ตัวอย่างเช่น LINQ เป็น SQL และ LINQ เป็นกิจการสามารถแปลเป็น SQL ได้หลายวิธี ฉันเพิ่งลอง LINQPad กับผู้ให้บริการ IQ MySql และFirstOrDefault()เพิ่มLIMIT 0,1ในขณะที่SingleOrDefault()ไม่เพิ่มอะไรเลย
ลูคัส

1
EF Core 2.1 แปล FirstOrDefault เป็น SELECT TOP (1), SingleOrDefault เป็น SELECT TOP (2)
camainc

19

สำหรับ LINQ -> SQL:

SingleOrDefault

  • จะสร้างข้อความค้นหาเช่น "select * จากผู้ใช้ที่ userid = 1"
  • เลือกระเบียนที่ตรงกันโยนข้อยกเว้นหากพบมากกว่าหนึ่งระเบียน
  • ใช้หากคุณกำลังดึงข้อมูลตามคอลัมน์คีย์หลัก / เฉพาะ

FirstOrDefault

  • จะสร้างข้อความค้นหาเช่น "select top 1 * จากผู้ใช้ที่ userid = 1"
  • เลือกแถวแรกที่ตรงกัน
  • ใช้หากคุณกำลังดึงข้อมูลตามคอลัมน์คีย์หลัก / ไม่ซ้ำกัน

ฉันคิดว่าคุณควรลบ "เลือกแถวที่ตรงกันทั้งหมด" จาก SingleOrDefault
Saim Abdullah

10

ฉันใช้SingleOrDefaultในสถานการณ์ที่ตรรกะของฉันบอกว่าผลลัพธ์จะเป็นศูนย์หรือผลลัพธ์เดียว หากมีมากกว่านั่นเป็นสถานการณ์ข้อผิดพลาดซึ่งเป็นประโยชน์


3
บ่อยครั้งที่ฉันพบว่า SingleOrDefault () ไฮไลต์กรณีที่ฉันไม่ได้ใช้การกรองที่ถูกต้องในชุดผลลัพธ์หรือในกรณีที่มีปัญหาเกี่ยวกับการทำซ้ำในข้อมูลพื้นฐาน บ่อยกว่าที่ฉันพบว่าตัวเองใช้ Single () และ SingleOrDefault () เหนือ First () วิธี
TimS

มีผลกระทบด้านประสิทธิภาพสำหรับ Single () และ SingleOrDefault () บน LINQ ไปยัง Objects ถ้าคุณมีจำนวนมาก แต่เมื่อพูดคุยกับฐานข้อมูล (เช่น SQL Server) จะทำการโทร 2 อันดับแรกและหากคุณติดตั้งดัชนีอย่างถูกต้องแล้ว การโทรไม่ควรแพงและฉันค่อนข้างจะล้มเหลวอย่างรวดเร็วและค้นหาปัญหาข้อมูลแทนที่จะแนะนำปัญหาข้อมูลอื่น ๆ โดยการทำสำเนาผิดเมื่อโทร First () หรือ FirstOrDefault ()
heartlandcoder

5

SingleOrDefault: คุณกำลังบอกว่า "มากที่สุด" มีหนึ่งรายการที่ตรงกับแบบสอบถามหรือค่าเริ่มต้น FirstOrDefault: คุณกำลังบอกว่ามีรายการ "อย่างน้อย" หนึ่งรายการที่ตรงกับแบบสอบถามหรือค่าเริ่มต้น

พูดออกมาดัง ๆ ในครั้งต่อไปที่คุณต้องเลือกและคุณน่าจะเลือกอย่างชาญฉลาด :)


5
จริงๆแล้วการไม่มีผลลัพธ์นั้นเป็นสิ่งที่ยอมรับได้อย่างสมบูรณ์ในการใช้FirstOrDefault. More correctly: FirstOrDefault` = จำนวนผลลัพธ์ใด ๆ แต่ฉันสนใจเฉพาะสิ่งแรกเท่านั้นอาจไม่มีผลลัพธ์ SingleOrDefault= มีผลลัพธ์ 1 หรือ 0 หากมีมากกว่านั่นหมายความว่ามีข้อผิดพลาด First= มีผลลัพธ์อย่างน้อยหนึ่งรายการและฉันต้องการมัน Single= มีผลลัพธ์ 1 รายการไม่มากไม่น้อยและฉันต้องการผลลัพธ์นั้น
Davy8

4

ในกรณีของคุณฉันจะใช้สิ่งต่อไปนี้:

เลือกตาม ID == 5: คุณสามารถใช้ SingleOrDefault ได้ที่นี่เพราะคุณคาดว่าจะมีเอนทิตี้หนึ่ง [หรือไม่มีเลย] หากคุณมีเอนทิตีมากกว่าหนึ่งรายการที่มี ID 5 มีบางอย่างผิดปกติและสมควรยกเว้นอย่างแน่นอน

เมื่อค้นหาผู้ที่มีชื่อแรกว่า "Bobby" อาจมีมากกว่าหนึ่ง (อาจเป็นไปได้ที่ฉันจะคิด) ดังนั้นคุณไม่ควรใช้ Single หรือ First เพียงเลือกด้วย Where-operation (หาก "Bobby" ส่งคืนมากเกินไป เอนทิตีผู้ใช้ต้องปรับแต่งการค้นหาของเขาหรือเลือกหนึ่งในผลลัพธ์ที่ส่งคืน)

ควรเรียงลำดับตามวันที่สร้างด้วย Where-operation (ไม่น่าจะมีเพียงเอนทิตี้เดียวการเรียงลำดับจะไม่ใช้ประโยชน์มาก) อย่างไรก็ตามสิ่งนี้บอกเป็นนัยว่าคุณต้องการเรียงลำดับเอนทิตี้ทั้งหมด - ถ้าคุณต้องการเพียงหนึ่งใช้ FirstOrDefault ซิงเกิลจะโยนทุกครั้งหากคุณมีเอนทิตีมากกว่าหนึ่ง


3
ฉันไม่เห็นด้วย. หากรหัสฐานข้อมูลของคุณเป็นคีย์หลักแสดงว่าฐานข้อมูลนั้นมีการบังคับใช้ที่ไม่ซ้ำกันอยู่แล้ว การสูญเสียรอบ CPU เพื่อตรวจสอบว่าฐานข้อมูลกำลังทำงานอยู่ในทุกแบบสอบถามหรือเปล่า
John Henckel

4

ทั้งสองเป็นตัวดำเนินการองค์ประกอบและพวกเขาจะใช้เพื่อเลือกองค์ประกอบเดียวจากลำดับ แต่มีความแตกต่างเล็กน้อยระหว่างพวกเขา ตัวดำเนินการ 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();

2
"มีความแตกต่างเล็กน้อยระหว่างพวกเขา" - นั่นสำคัญ!
Nikhil Vartak

3

ในตัวอย่างสุดท้ายของคุณ:

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

ใช่. หากคุณพยายามใช้SingleOrDefault()และผลลัพธ์แบบสอบถามเป็นมากกว่าระเบียนคุณจะได้รับและยกเว้น เวลาเดียวที่คุณสามารถใช้งานได้อย่างปลอดภัยSingleOrDefault()คือเมื่อคุณคาดหวังผลลัพธ์เพียง 1 และ 1 เท่านั้น ...


ถูกต้อง. หากคุณได้รับ 0 ผลคุณจะได้รับการยกเว้น
Dennis Rongo

1

ดังนั้นที่ฉันเข้าใจในตอนนี้SingleOrDefaultจะดีถ้าคุณกำลังสอบถามข้อมูลที่รับประกันว่าจะไม่ซ้ำกันเช่นบังคับใช้โดยข้อ จำกัด ของ DB เช่นคีย์หลัก

หรือมีวิธีที่ดีกว่าในการค้นหาคีย์หลัก

สมมติว่า TableAcc ของฉันมี

AccountNumber - Primary Key, integer
AccountName
AccountOpenedDate
AccountIsActive
etc.

และฉันต้องการสอบถามAccountNumber 987654ฉันใช้

var data = datacontext.TableAcc.FirstOrDefault(obj => obj.AccountNumber == 987654);

1

ในความคิดของฉันFirstOrDefaultถูกใช้มากเกินไป ในกรณีส่วนใหญ่เมื่อคุณกำลังกรองข้อมูลคุณอาจคาดว่าจะได้รับคอลเลกชันขององค์ประกอบที่ตรงกับเงื่อนไขเชิงตรรกะหรือองค์ประกอบที่ไม่ซ้ำกันเดียวโดยตัวระบุที่ไม่ซ้ำกัน - เช่นผู้ใช้หนังสือโพสต์ ฯลฯ ... ทำไมเราถึงได้บอกว่าFirstOrDefault()มันเป็นรหัสกลิ่นไม่ใช่เพราะมีบางอย่างผิดปกติ แต่เพราะมันถูกใช้บ่อยเกินไป โพสต์บล็อกนี้สำรวจหัวข้อในรายละเอียด IMO ส่วนใหญ่SingleOrDefault()เป็นทางเลือกที่ดีกว่าดังนั้นโปรดระวังข้อผิดพลาดนี้และตรวจสอบให้แน่ใจว่าคุณใช้วิธีการที่เหมาะสมที่สุดที่แสดงถึงสัญญาและความคาดหวังของคุณอย่างชัดเจน


-1

สิ่งหนึ่งที่พลาดในการตอบสนอง ....

หากมีผลลัพธ์หลายรายการ FirstOrDefault ที่ไม่มีคำสั่งซื้อสามารถนำผลลัพธ์ที่แตกต่างกันกลับมาโดยใช้กลยุทธ์การทำดัชนีที่เซิร์ฟเวอร์ใช้

โดยส่วนตัวฉันไม่สามารถเห็น FirstOrDefault เป็นรหัสได้เพราะสำหรับฉันแล้วมันบอกว่านักพัฒนาไม่สนใจผลลัพธ์ ด้วยคำสั่งโดยแม้ว่ามันจะมีประโยชน์เป็นวิธีการบังคับใช้ล่าสุด / เร็วที่สุด ฉันต้องแก้ไขปัญหามากมายที่เกิดจากนักพัฒนาที่ไม่เอาใจใส่โดยใช้ FirstOrDefault


-2

ฉันสอบถาม Google เกี่ยวกับการใช้วิธีการต่างๆใน GitHub สิ่งนี้ทำได้โดยเรียกใช้คำค้นหาของ Google สำหรับแต่ละวิธีและ จำกัด การสืบค้นไว้ที่โดเมน github.com และนามสกุลไฟล์. cs โดยใช้คำค้นหา "site: github.com file: cs ... "

ดูเหมือนว่าวิธี First * นั้นมักจะใช้มากกว่าวิธี Single *

| Method               | Results |
|----------------------|---------|
| FirstAsync           |     315 |
| SingleAsync          |     166 |
| FirstOrDefaultAsync  |     357 |
| SingleOrDefaultAsync |     237 |
| FirstOrDefault       |   17400 |
| SingleOrDefault      |    2950 |

-8

ผมไม่เข้าใจว่าทำไมคุณกำลังใช้เมื่อนี้สามารถเรียกผลได้เร็วขึ้นมากถ้าคุณใช้FirstOrDefault(x=> x.ID == key) ถ้าคุณจะสอบถามกับคีย์หลักของตารางกฎของหัวแม่มืออยู่เสมอการใช้งานFind(key) ควรใช้สำหรับเพรดิเคตสิ่งต่างๆเป็นต้นFind(key)FirstOrDefault(x=> x.Username == username)

สิ่งนี้ไม่สมควรได้รับ downvote เนื่องจากหัวข้อของคำถามนั้นไม่ได้เจาะจงเฉพาะ linq บน DB หรือ Linq ไปยัง List / IEnumerable เป็นต้น


1
namespace ใดที่อยู่Find()ใน?
p.campbell

คุณช่วยบอกเราทีได้ไหม ยังคงรอคำตอบ
Denny

อาจเป็นไปได้: stackoverflow.com/questions/14032709/…
Jeppe

คำว่า "IEnumerable" อยู่ในบรรทัดแรกของเนื้อความคำถาม หากคุณเพียงอ่านชื่อเรื่องไม่ใช่คำถามจริงและโพสต์คำตอบที่ไม่ถูกต้องนั่นเป็นความผิดพลาดของคุณและเป็นเหตุผลที่ถูกต้องตามกฎหมายในการลงคะแนน IMO
F1Krazy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.