LINQ คืออะไร? ฉันรู้ว่ามันมีไว้สำหรับฐานข้อมูล แต่มันทำอะไรได้บ้าง?
LINQ คืออะไร? ฉันรู้ว่ามันมีไว้สำหรับฐานข้อมูล แต่มันทำอะไรได้บ้าง?
คำตอบ:
LINQย่อมาจากภาษา Integrated Query
แทนที่จะเขียน YAQL (Yet Another Query Language) นักพัฒนาภาษาของ Microsoft ได้จัดเตรียมวิธีการแสดงแบบสอบถามโดยตรงในภาษาของตน (เช่น C # และ Visual Basic) เทคนิคในการสร้างแบบสอบถามเหล่านี้ไม่ได้ขึ้นอยู่กับรายละเอียดการใช้งานของสิ่งที่กำลังสอบถามเพื่อให้คุณสามารถเขียนแบบสอบถามที่ถูกต้องกับเป้าหมายจำนวนมาก (ฐานข้อมูลวัตถุในหน่วยความจำ XML) โดยไม่ต้องคำนึงถึงวิธีการพื้นฐานในทางปฏิบัติ การสืบค้นจะถูกดำเนินการ
เริ่มต้นการสำรวจนี้ด้วยชิ้นส่วนที่เป็นของ. NET Framework (3.5)
LINQ To Objects - ตรวจสอบSystem.Linq.Enumerableสำหรับวิธีการสืบค้น เป้าหมายเหล่านี้IEnumerable<T>
ช่วยให้สามารถค้นหาคอลเล็กชันแบบวนซ้ำที่พิมพ์ได้ในลักษณะที่ปลอดภัย คำค้นหาเหล่านี้อาศัยวิธีการ. NET ที่คอมไพล์แล้วไม่ใช่นิพจน์
LINQ To Anything - ตรวจสอบSystem.Linq.Queryableสำหรับวิธีการสืบค้นบางอย่าง เป้าหมายเหล่านี้IQueryable<T>
ทำให้สามารถสร้าง Expression Trees ที่สามารถแปลได้โดยการใช้งานพื้นฐาน
ต้นไม้นิพจน์ - ตรวจสอบเนมสเปซSystem.Linq.Expressions นี่คือรหัสเป็นข้อมูล ในทางปฏิบัติคุณควรตระหนักถึงสิ่งนี้ แต่ไม่จำเป็นต้องเขียนโค้ดกับประเภทเหล่านี้ คุณลักษณะของภาษา (เช่นนิพจน์แลมบ์ดา) ช่วยให้คุณใช้มือสั้นต่างๆเพื่อหลีกเลี่ยงการติดต่อกับประเภทเหล่านี้โดยตรง
LINQ เป็น SQL - ตรวจสอบเนมสเปซSystem.Data.Linq โดยเฉพาะอย่างยิ่งสังเกตDataContext
. นี่คือเทคโนโลยี DataAccess ที่สร้างโดยทีม C # มันใช้งานได้
LINQ ถึงเอนทิตี - ตรวจสอบเนมสเปซSystem.Data.Objects โดยเฉพาะอย่างยิ่งสังเกตObjectContext
. นี่คือเทคโนโลยี DataAccess ที่สร้างโดยทีม ADO.NET มีความซับซ้อนมีประสิทธิภาพและใช้งานยากกว่า LINQ To SQL
LINQ เป็น XML - ตรวจสอบเนมสเปซSystem.Xml.Linq โดยพื้นฐานแล้วผู้คนไม่พอใจกับสิ่งที่เข้าSystem.Xml
มา ดังนั้น Microsoft จึงเขียนใหม่และใช้ประโยชน์จากการเขียนซ้ำเพื่อแนะนำวิธีการบางอย่างที่ทำให้ใช้ LINQ To Objects เทียบกับ XML ได้ง่ายขึ้น
บางชนิดช่วยที่ดีเช่นFuncและการดำเนินการ ประเภทเหล่านี้เป็นตัวแทนที่มีการสนับสนุนทั่วไป หมดไปแล้วคือวันแห่งการประกาศประเภทผู้ร่วมประชุมที่กำหนดเอง (และไม่สามารถแลกเปลี่ยนกันได้) ของคุณเอง
ทั้งหมดข้างต้นเป็นส่วนหนึ่งของ. NET Framework และพร้อมใช้งานจากภาษา. NET (VB.NET, C #, IronPython, COBOL .NET และอื่น ๆ )
โอเคสำหรับคุณสมบัติภาษา ฉันจะยึดติดกับ C # เพราะนั่นคือสิ่งที่ฉันรู้ดีที่สุด VB.NET ยังมีการปรับปรุงที่คล้ายกันหลายอย่าง (และอีกสองสามอย่างที่ C # ไม่ได้รับ - ตัวอักษร XML) นี่เป็นรายการที่สั้นและไม่สมบูรณ์
วิธีการขยาย - ช่วยให้คุณสามารถ "เพิ่ม" วิธีการพิมพ์ได้ วิธีนี้เป็นวิธีการแบบคงที่ที่ส่งผ่านอินสแตนซ์ของประเภทและถูก จำกัด ไว้ที่สัญญาสาธารณะประเภทนั้น ๆ แต่จะมีประโยชน์มากสำหรับการเพิ่มวิธีการให้กับประเภทที่คุณไม่ได้ควบคุม (สตริง) หรือเพิ่ม (ใช้งานอย่างสมบูรณ์ ) วิธีการช่วยเหลือในการเชื่อมต่อ
Query Comprehensive Syntax - สิ่งนี้ช่วยให้คุณสามารถเขียนในโครงสร้าง SQL Like ข้อมูลทั้งหมดนี้ได้รับการแปลเป็นวิธีการบน System.Linq.Queryable หรือ System.Linq.Enumerable (ขึ้นอยู่กับประเภทของ myCustomers) เป็นทางเลือกที่สมบูรณ์และคุณสามารถใช้ LINQ ได้โดยไม่ต้องใช้มัน ข้อดีอย่างหนึ่งของการประกาศแบบสอบถามลักษณะนี้คือตัวแปรช่วงจะถูกกำหนดขอบเขต: ไม่จำเป็นต้องประกาศซ้ำสำหรับแต่ละประโยค
IEnumerable<string> result =
from c in myCustomers
where c.Name.StartsWith("B")
select c.Name;
Lambda Expressions - นี่คือชวเลขสำหรับระบุวิธีการ เรียบเรียง C # System.Linq.Expressions.Expression
จะแปลในแต่ละทั้งวิธีการที่ไม่ระบุชื่อหรือที่เป็นจริง คุณต้องเข้าใจสิ่งเหล่านี้เพื่อใช้ Linq ให้ดี มีสามส่วน ได้แก่ รายการพารามิเตอร์ลูกศรและเนื้อหาวิธีการ
IEnumerable<string> result = myCustomers
.Where(c => c.Name.StartsWith("B"))
.Select(c => c.Name);`
Anonymous types - บางครั้งคอมไพลเลอร์มีข้อมูลเพียงพอที่จะสร้างประเภทให้คุณ ประเภทเหล่านี้ไม่ได้ระบุชื่ออย่างแท้จริง: คอมไพเลอร์จะตั้งชื่อเมื่อสร้างขึ้น แต่ชื่อเหล่านั้นเกิดขึ้นในเวลาคอมไพล์ซึ่งสายเกินไปที่นักพัฒนาจะใช้ชื่อนั้นในขณะออกแบบ
myCustomers.Select(c => new
{
Name = c.Name;
Age = c.Age;
})
ประเภทโดยนัย - บางครั้งคอมไพเลอร์มีข้อมูลเพียงพอจากการเริ่มต้นที่สามารถระบุประเภทให้คุณได้ คุณสามารถสั่งให้คอมไพเลอร์ทำได้โดยใช้คีย์เวิร์ด var จำเป็นต้องมีการพิมพ์โดยนัยเพื่อประกาศตัวแปรสำหรับ Anonymous types เนื่องจากโปรแกรมเมอร์ไม่สามารถใช้ชื่อของประเภทที่ไม่ระบุตัวตนได้
// The compiler will determine that names is an IEnumerable<string>
var names = myCustomers.Select(c => c.Name);
LINQ (Language INtegrated Query) อาจอ้างถึง:
ไลบรารีสำหรับการรวบรวมและการจัดการตัววนซ้ำที่ใช้ประโยชน์จากฟังก์ชันลำดับที่สูงกว่าเป็นอาร์กิวเมนต์ (System.Linq)
ไลบรารีสำหรับการส่งผ่านและการจัดการฟังก์ชันง่ายๆเป็นโครงสร้างไวยากรณ์นามธรรม (System.Linq.Expressions)
ส่วนขยายไวยากรณ์ไปยังภาษาต่างๆเพื่อจัดเตรียมไวยากรณ์ที่เหมือน SQL มากขึ้นสำหรับการประมวลผลคอลเลกชันสัญกรณ์ที่กะทัดรัดยิ่งขึ้นสำหรับฟังก์ชันที่ไม่ระบุชื่อและกลไกในการแนะนำฟังก์ชันตัวช่วยแบบคงที่ซึ่งแยกไม่ออกจากฟังก์ชันสมาชิกขั้นสุดท้าย
คำจำกัดความของอินเทอร์เฟซที่ผู้ให้บริการข้อมูลอาจปฏิบัติตามเพื่อรับโครงสร้างแบบสอบถามและอาจดำเนินการเพิ่มประสิทธิภาพในนั้นหรือในบางครั้งผู้ให้บริการข้อมูลที่เข้ากันได้เอง
ส่วนประกอบอาจใช้ในการแยกหรือรวมกัน
โดยสรุป LINQ (Language-Integrated Query) ช่วยให้คุณสามารถเขียนแบบสอบถามโดยตรงในโค้ดของคุณ คิวรีเหล่านั้นสามารถอยู่บนฐานข้อมูลเชิงสัมพันธ์ แต่ยังอยู่บน XML หรืออ็อบเจ็กต์คอนเทนเนอร์ในหน่วยความจำเช่นอาร์เรย์และรายการ ข้อมูลเพิ่มเติมมีอยู่ในไลบรารี MSDN: http://msdn.microsoft.com/en-us/library/bb308959.aspx
ฉันจะลองคำตอบง่ายๆ: LINQ เป็นวิธีที่คุณสามารถสืบค้นฐานข้อมูลของคุณ (หรือที่เก็บข้อมูลอื่น ๆ , XML และอื่น ๆ ) โดยใช้ภาษาแบบสอบถามที่คล้ายกับ SQL แต่สามารถคอมไพล์ภายในแอปพลิเคชัน. NET
From Where Select, etc.
- กล่าวคือควรเขียนในลักษณะที่ชุดผลลัพธ์เกิดขึ้นจริง
LINQ ย่อมาจากLanguage Integrated Queryและเป็นวิธีการจัดเตรียมกลไก "การสืบค้น" สำหรับวัตถุประสงค์ทั่วไปใน CLR
ในระดับพื้นฐานที่สุดจะประกอบด้วยชุดวิธีการบน IEnumerable <T> - เช่น Select, Sum, Where - ที่สามารถใช้สำหรับข้อ จำกัด การคาดการณ์ ฯลฯ [1]
เพื่อให้ดียิ่งขึ้น LINQ ยังกำหนดรูปแบบผู้ให้บริการ LINQ ใหม่ที่สามารถใช้แผนภูมินิพจน์และใช้เพื่อเรียกใช้แบบสอบถาม "เนทีฟ" กับแหล่งข้อมูลภายนอก CLR เช่น LINQ เป็น SQL, LINQ เป็น XML, LINQ ไปยัง NHibernate เป็นต้น
C # และ VB.NET ยังได้กำหนดไวยากรณ์คิวรีที่ช่วยให้คุณสามารถเขียนข้อความค้นหาแบบอินไลน์ (ซึ่งดูคล้ายกับ SQL มาก) ซึ่งคอมไพลเลอร์จะแปลเป็นการเรียก <T> ของ IEnumerable
สำหรับฉันสิ่งที่น่าสนใจที่สุดเกี่ยวกับ LINQ คือคุณสมบัติ C # และ VB.NET ทั้งหมดที่จำเป็นเพื่อรองรับมันมีประโยชน์ในแบบของพวกเขาเอง วิธีการขยายประเภทที่ไม่ระบุตัวตนนิพจน์แลมบ์ดาและการพิมพ์โดยนัยล้วนจำเป็นเพื่อรองรับ LINQ - แต่เรามักจะใช้คุณสมบัติเหล่านั้นนอกบริบท LINQ ที่บริสุทธิ์
[1] คำเหล่านี้เป็นคำที่สัมพันธ์กันโปรแกรมเมอร์ที่ใช้งานได้น่าจะชอบแผนที่ลดพับและอื่น ๆ
LINQ เป็นเทคโนโลยีสำหรับการดึงข้อมูลโดยใช้สำนวนที่มาจากภาษาโปรแกรม C # แม้ว่าจะต้องใช้การออกแบบการทำงานของ SQL เป็นจำนวนมาก แต่ก็เป็นภาษาการสืบค้นข้อมูลของตัวเองโดยพื้นฐาน ดำเนินการในแหล่งข้อมูลที่หลากหลาย (ฐานข้อมูล SQL การแสดงในหน่วยความจำ XML ฯลฯ ) โดยเฉพาะอย่างยิ่ง LINQ-To-SQL ควรถูกมองว่าตรงกันข้ามกับการใช้ SQL แบบฝังแบบดั้งเดิมซึ่งทนทุกข์ทรมานจากสิ่งที่มักเรียกกันว่า "ความต้านทานไม่ตรงกัน" ระหว่างการเขียนโปรแกรม SQL และการเขียนโปรแกรม C # / VB
สำหรับการอภิปรายเกี่ยวกับ LINQ และข้อ จำกัด คุณอาจต้องการดูคำถามที่เกี่ยวข้องนี้: LINQ กับ SQL ไม่พลาดประเด็นหรือไม่?
http://msdn.microsoft.com/en-us/netframework/aa904594.aspx
"โครงการ LINQ เป็นชื่อรหัสสำหรับชุดของส่วนขยายไปยัง. NET Framework ที่ครอบคลุมการสืบค้นรวมภาษาตั้งค่าและแปลงการดำเนินการโดยขยาย C # และ Visual Basic ด้วยไวยากรณ์ภาษาพื้นเมืองสำหรับการสืบค้นและจัดเตรียมไลบรารีคลาสเพื่อใช้ประโยชน์จาก ความสามารถเหล่านี้ "