IEnumerable<T>
T
แสดงให้เห็นถึงเคอร์เซอร์ไปข้างหน้าอย่างเดียว NET 3.5 วิธีการเพิ่มส่วนขยายที่รวมLINQ standard query operators
ชอบWhere
และFirst
มีผู้ประกอบการใด ๆ Func<T>
ที่จำเป็นต้องมีภาคหรือฟังก์ชันที่ไม่ระบุชื่อการ
IQueryable<T>
ใช้ตัวดำเนินการแบบสอบถามมาตรฐาน LINQ เดียวกัน แต่ยอมรับExpression<Func<T>>
สำหรับเพรดิเคตและฟังก์ชันที่ไม่ระบุชื่อ Expression<T>
เป็นทรีนิพจน์ที่คอมไพล์ซึ่งเป็นเวอร์ชันที่เสียของเมธอด ("คอมไพล์ครึ่ง" หากคุณต้องการ) ที่สามารถแยกวิเคราะห์โดยผู้ให้บริการที่สามารถสืบค้นได้และใช้ตามนั้น
ตัวอย่างเช่น:
IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();
ในบล็อกแรกx => x.Age > 18
เป็นวิธีที่ไม่ระบุชื่อ ( Func<Person, bool>
) ซึ่งสามารถดำเนินการได้เหมือนกับวิธีอื่นใด Enumerable.Where
จะดำเนินการวิธีการครั้งเดียวสำหรับแต่ละบุคคลyield
ing true
ค่าซึ่งวิธีการส่งกลับ
ในบล็อกที่สองx => x.Age > 18
เป็นต้นไม้แสดงออก ( Expression<Func<Person, bool>>
) ซึ่งสามารถคิดได้ว่าเป็น "เป็นคุณสมบัติ 'อายุ'> 18"
สิ่งนี้อนุญาตให้สิ่งต่าง ๆ เช่น LINQ-to-SQL มีอยู่ได้เนื่องจากสามารถแยกวิเคราะห์แผนผังของนิพจน์และแปลงเป็น SQL ที่เทียบเท่าได้ และเนื่องจากผู้ให้บริการไม่จำเป็นต้องดำเนินการจนกว่าIQueryable
จะแจกแจง (ดำเนินการIEnumerable<T>
หลังจากทั้งหมด) จึงสามารถรวมตัวดำเนินการแบบสอบถามหลายรายการ (ในตัวอย่างด้านบนWhere
และFirstOrDefault
) เพื่อสร้างตัวเลือกที่ชาญฉลาดเกี่ยวกับวิธีดำเนินการแบบสอบถามทั้งหมดกับข้อมูลพื้นฐาน แหล่งที่มา (เช่นใช้SELECT TOP 1
ใน SQL)
ดู: