LINQ ส่งคืนอะไรเมื่อผลลัพธ์ว่างเปล่า


319

ฉันมีคำถามเกี่ยวกับการสืบค้น LINQ โดยปกติแบบสอบถามส่งกลับIEnumerable<T>ชนิด หากการส่งคืนว่างเปล่าไม่แน่ใจว่าเป็นโมฆะหรือไม่ ฉันไม่แน่ใจว่าสิ่งต่อไปนี้ToList()จะทำให้เกิดข้อยกเว้นหรือเปล่าList<string>หากไม่พบIEnumerableผลลัพธ์?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

ฉันรู้ว่ามันเป็นคำถามที่ง่ายมาก แต่ฉันไม่มี VS พร้อมใช้งานในขณะนี้


11
ฉันเดาว่าผลลัพธ์คือ Enumerable.Empty?
David.Chu.ca

คำตอบ:


512

มันจะคืนค่าว่างนับ มันจะไม่เป็นโมฆะ คุณสามารถนอนหลับเสียง :)


38

คุณยังสามารถตรวจสอบ.Any()วิธีการ:

if (!YourResult.Any())

เพียงแค่ทราบว่า.Anyจะยังคงดึงข้อมูลจากฐานข้อมูลนั้น การทำ.FirstOrDefault()/.Where()จะเป็นเพียงค่าใช้จ่ายมาก แต่คุณจะสามารถจับวัตถุที่ส่งคืนจากแบบสอบถาม


5
คำถามพูดถึงฐานข้อมูลที่ไหน?
cja

4
คุณจะต้องถามคนที่แก้ไขที่ผมไม่ได้พูดถึงใด ๆ :) DB
Noich

การแก้ไขจุดกำลังทำเสียง แต่ DB หรือไม่ ฉันเชื่อว่าพวกเขากำลังบอกว่า.Any()จะบอกคุณว่าคุณมีบันทึกการจับคู่ใด ๆ ที่ทำแบบสอบถามจริงเพื่อหาค่าเฉพาะอาจเป็นโมฆะเมื่อ.Any()ไม่ได้
vapcguy

1
การแก้ไขอาจผิดพลาดจริง ๆ หากใช้ linq ไปยังเอนทิตี db อาจช็อตคัตนี้และไม่มีข้อมูลใดถูกส่งไปยังไคลเอ็นต์ยกเว้น true หรือ false
Mafii

19
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(การถ่ายโอนข้อมูลมาจากLinqPad )


แน่นอน! คุณจะได้รับการบ่งชี้ที่ดีขึ้นของการค้นพบ
netfed

TIL Count()ยังเป็นวิธีการไม่ใช่เพียงคุณสมบัติ
heyNow

2
คุณไม่ควรใช้. ใด ๆ () เพราะจำนวนจะนับผ่านทุกรายการ?
SHEePYTaGGeRNeP


8

ใน Linq-to-SQL ถ้าคุณพยายามที่จะรับองค์ประกอบแรกในแบบสอบถามที่ไม่มีผลลัพธ์คุณจะได้รับsequence contains no elementsข้อผิดพลาด object reference not set to an instance of an objectฉันสามารถมั่นใจได้ว่าข้อผิดพลาดดังกล่าวไม่เท่ากับ สรุปไม่ได้มันจะไม่คืนค่าว่างเปล่าเนื่องจาก null ไม่สามารถพูดได้ว่าsequence contains no elementsจะพูดเสมอobject reference not set to an instance of an object;)


1
โอ้คำอธิบายของคุณช่วยให้เข้าใจมากขึ้น ขอบคุณ !
Kay Lee

นี่ตอบคำถามหรือไม่
ChiefTwoPencils

7

โพสต์อื่น ๆ ที่นี่ได้ทำให้ชัดเจนว่าผลที่ได้คือ "ว่างเปล่า" IQueryable ซึ่ง ToList () จะถูกเปลี่ยนเป็นรายการที่ว่างเปล่าอย่างถูกต้อง ฯลฯ

ระวังตัวดำเนินการบางอย่างเพราะพวกเขาจะโยนถ้าคุณส่งจำนวนที่ว่างเปล่า สิ่งนี้สามารถเกิดขึ้นได้เมื่อคุณโยงมันเข้าด้วยกัน


3
"ระวังตัวดำเนินการบางอย่างเพราะพวกเขาจะโยนถ้าคุณส่งจำนวนที่ว่างเปล่าสิ่งนี้สามารถเกิดขึ้นได้เมื่อคุณโยงมันเข้าด้วยกัน" - นี่คือสิ่งที่ได้รับฉัน ฉันมีค่าคืน null ที่ฉันป้อนเข้าแบบสอบถามอื่น สิ่งนี้ทำให้คิวรีที่สองโยนไม่ว่าฉันจะส่งอะไรไปเนื่องจากไม่มีค่าที่ป้อนเข้าในคิวรีที่สอง
เทรเวอร์

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