LINQ คืออะไรและทำอะไร? [ปิด]


126

LINQ คืออะไร? ฉันรู้ว่ามันมีไว้สำหรับฐานข้อมูล แต่มันทำอะไรได้บ้าง?


20
ฉันเชื่อว่าฉันแพ้เกณฑ์ที่ "ไม่สามารถตอบได้อย่างสมเหตุสมผล" ไม่มีเหตุผลที่ควรปิดคำถามนี้
Amy B

1
ฟังผู้สร้าง LINQ Erik Meijer พูดว่ามันคืออะไร BTW ไม่ใช่สำหรับฐานข้อมูลเพียงอย่างเดียว
Sнаđошƒаӽ

คำตอบ:


171

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);
    

14

LINQ (Language INtegrated Query) อาจอ้างถึง:

  • ไลบรารีสำหรับการรวบรวมและการจัดการตัววนซ้ำที่ใช้ประโยชน์จากฟังก์ชันลำดับที่สูงกว่าเป็นอาร์กิวเมนต์ (System.Linq)

  • ไลบรารีสำหรับการส่งผ่านและการจัดการฟังก์ชันง่ายๆเป็นโครงสร้างไวยากรณ์นามธรรม (System.Linq.Expressions)

  • ส่วนขยายไวยากรณ์ไปยังภาษาต่างๆเพื่อจัดเตรียมไวยากรณ์ที่เหมือน SQL มากขึ้นสำหรับการประมวลผลคอลเลกชันสัญกรณ์ที่กะทัดรัดยิ่งขึ้นสำหรับฟังก์ชันที่ไม่ระบุชื่อและกลไกในการแนะนำฟังก์ชันตัวช่วยแบบคงที่ซึ่งแยกไม่ออกจากฟังก์ชันสมาชิกขั้นสุดท้าย

  • คำจำกัดความของอินเทอร์เฟซที่ผู้ให้บริการข้อมูลอาจปฏิบัติตามเพื่อรับโครงสร้างแบบสอบถามและอาจดำเนินการเพิ่มประสิทธิภาพในนั้นหรือในบางครั้งผู้ให้บริการข้อมูลที่เข้ากันได้เอง

ส่วนประกอบอาจใช้ในการแยกหรือรวมกัน


10

โดยสรุป LINQ (Language-Integrated Query) ช่วยให้คุณสามารถเขียนแบบสอบถามโดยตรงในโค้ดของคุณ คิวรีเหล่านั้นสามารถอยู่บนฐานข้อมูลเชิงสัมพันธ์ แต่ยังอยู่บน XML หรืออ็อบเจ็กต์คอนเทนเนอร์ในหน่วยความจำเช่นอาร์เรย์และรายการ ข้อมูลเพิ่มเติมมีอยู่ในไลบรารี MSDN: http://msdn.microsoft.com/en-us/library/bb308959.aspx


นี่คือความแม่นยำและรัดกุม
SSD

6

ฉันจะลองคำตอบง่ายๆ: LINQ เป็นวิธีที่คุณสามารถสืบค้นฐานข้อมูลของคุณ (หรือที่เก็บข้อมูลอื่น ๆ , XML และอื่น ๆ ) โดยใช้ภาษาแบบสอบถามที่คล้ายกับ SQL แต่สามารถคอมไพล์ภายในแอปพลิเคชัน. NET


1
Linq และ SQL แตกต่างกันอย่างไร?
Kredns

มีชื่อที่ซับซ้อนกว่านี้ฉันคิดว่า แต่โครงสร้างต่างกัน: SQL คือ Select From Where และ LINQ คือ From Where Select LINQ วนซ้ำได้ง่ายกว่าด้วย LINQ นั้นง่ายกว่า :) และ SQL ที่สร้างมักจะดีพอเมื่อพิจารณาถึงการประหยัดเวลา
jcollum

2
พูดตามตรงเราสามารถโต้แย้งว่า SQL ควรเขียนเป็นFrom Where Select, etc.- กล่าวคือควรเขียนในลักษณะที่ชุดผลลัพธ์เกิดขึ้นจริง
Don Cheadle

6

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] คำเหล่านี้เป็นคำที่สัมพันธ์กันโปรแกรมเมอร์ที่ใช้งานได้น่าจะชอบแผนที่ลดพับและอื่น ๆ


5

LINQ เป็นเทคโนโลยีสำหรับการดึงข้อมูลโดยใช้สำนวนที่มาจากภาษาโปรแกรม C # แม้ว่าจะต้องใช้การออกแบบการทำงานของ SQL เป็นจำนวนมาก แต่ก็เป็นภาษาการสืบค้นข้อมูลของตัวเองโดยพื้นฐาน ดำเนินการในแหล่งข้อมูลที่หลากหลาย (ฐานข้อมูล SQL การแสดงในหน่วยความจำ XML ฯลฯ ) โดยเฉพาะอย่างยิ่ง LINQ-To-SQL ควรถูกมองว่าตรงกันข้ามกับการใช้ SQL แบบฝังแบบดั้งเดิมซึ่งทนทุกข์ทรมานจากสิ่งที่มักเรียกกันว่า "ความต้านทานไม่ตรงกัน" ระหว่างการเขียนโปรแกรม SQL และการเขียนโปรแกรม C # / VB

สำหรับการอภิปรายเกี่ยวกับ LINQ และข้อ จำกัด คุณอาจต้องการดูคำถามที่เกี่ยวข้องนี้: LINQ กับ SQL ไม่พลาดประเด็นหรือไม่?


0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

"โครงการ LINQ เป็นชื่อรหัสสำหรับชุดของส่วนขยายไปยัง. NET Framework ที่ครอบคลุมการสืบค้นรวมภาษาตั้งค่าและแปลงการดำเนินการโดยขยาย C # และ Visual Basic ด้วยไวยากรณ์ภาษาพื้นเมืองสำหรับการสืบค้นและจัดเตรียมไลบรารีคลาสเพื่อใช้ประโยชน์จาก ความสามารถเหล่านี้ "


สำหรับฐานข้อมูลหรือไม่? สำหรับสิ่งที่ฉันเห็นที่นี่ (ใน SO) เป็นเหมือนคอลเล็กชันในสภาพแวดล้อม. net
OscarRyz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.