LINQ เป็นชุดเทคโนโลยีที่หลากหลายโดยอิงตาม (ตัวอย่าง) ไวยากรณ์การทำความเข้าใจแบบสอบถามตัวอย่างเช่น:
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
ซึ่งถูกแมปโดยคอมไพเลอร์เป็นรหัส:
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
และนี่คือเวทมนตร์ที่แท้จริงเริ่มต้นขึ้น โปรดทราบว่าเราไม่ได้พูดว่าอะไรFoo
อยู่ที่นี่ - และคอมไพเลอร์ไม่สนใจ! ตราบเท่าที่สามารถแก้ไขวิธีการที่เหมาะสมบางอย่างที่เรียกWhere
ว่าสามารถใช้แลมด้าได้และผลลัพธ์ของวิธีนั้นมีวิธีการบางอย่าง Select
ที่สามารถยอมรับแลมด้าได้ก็มีความสุข
ตอนนี้พิจารณาว่าแลมบ์ดาสามารถรวบรวมทั้งเป็นวิธีการที่ไม่ระบุชื่อ (ผู้รับมอบสิทธิ์สำหรับ LINQ เพื่อวัตถุซึ่งรวมถึง LINQ ไปชุดข้อมูล) หรือการแสดงออกต้นไม้ (โมเดลรันไทม์ที่แสดงถึงแลมบ์ดาในรูปแบบวัตถุ ).
สำหรับข้อมูลในหน่วยความจำ (โดยทั่วไปIEnumerable<T>
) จะดำเนินการกับผู้รับมอบสิทธิ์อย่างดีและรวดเร็ว แต่สำหรับIQueryable<T>
การแสดงวัตถุของนิพจน์ (a LambdaExpression<...>
) สามารถดึงมันออกจากกันและนำไปใช้กับตัวอย่าง "LINQ-to-Something"
สำหรับฐานข้อมูล (LINQ-to-SQL, LINQ-to-Entities) อาจหมายถึงการเขียน TSQL ตัวอย่างเช่น:
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
แต่อาจ (สำหรับ ADO.NET Data Services เป็นต้น) หมายถึงการเขียนแบบสอบถาม HTTP
การดำเนินการสืบค้น TSQL ที่เขียนดีซึ่งส่งคืนข้อมูลจำนวนเล็กน้อยนั้นเร็วกว่าการโหลดฐานข้อมูลทั้งหมดผ่านเครือข่ายจากนั้นกรองที่ไคลเอนต์ ทั้งสองมีสถานการณ์ในอุดมคติและสถานการณ์ที่ผิดธรรมดา
เป้าหมายและประโยชน์ที่นี่คือการอนุญาตให้คุณใช้ไวยากรณ์ที่ตรวจสอบแบบคงที่เพียงชุดเดียวเพื่อสืบค้นแหล่งข้อมูลที่หลากหลายและเพื่อทำให้โค้ดมีความหมายมากขึ้น (โค้ด "ดั้งเดิม" ในการจัดกลุ่มข้อมูลเช่นไม่ใช่ ชัดเจนมากในแง่ของสิ่งที่พยายามทำ - มันหายไปในมวลของรหัส)