อะไรคือความแตกต่างระหว่าง“ LINQ to Entities”,“ LINQ to SQL” และ“ LINQ to Dataset”


91

ฉันทำงานกับ LINQ มาระยะหนึ่งแล้ว อย่างไรก็ตามยังคงเป็นปริศนาอยู่เล็กน้อยว่าความแตกต่างที่แท้จริงระหว่างรสชาติที่กล่าวถึงของ LINQ คืออะไร

คำตอบที่ประสบความสำเร็จจะมีความแตกต่างสั้น ๆ ระหว่างพวกเขา เป้าหมายหลักของแต่ละรสชาติคืออะไรมีประโยชน์อย่างไรและมีผลต่อประสิทธิภาพ ...

ป.ล. ฉันรู้ว่ามีแหล่งข้อมูลมากมายอยู่ที่นั่น แต่ฉันกำลังมองหา "ข้อมูลโกง" ชนิดหนึ่งที่แนะนำให้มือใหม่ไปหาเป้าหมายที่เจาะจง


คำตอบ:


110
  • ทั้งหมดนี้เป็น LINQ - Language Integrated Query - ดังนั้นทุกคนจึงมีความคล้ายคลึงกัน "ภาษาถิ่น" ทั้งหมดนี้โดยพื้นฐานแล้วช่วยให้คุณสามารถเลือกข้อมูลในรูปแบบแบบสอบถามจากแหล่งต่างๆ

  • Linq-to-SQLเป็นความพยายามครั้งแรกของ Microsoft ใน ORM - Object-Relational Mapper รองรับ SQL Server เท่านั้น เป็นเทคโนโลยีการทำแผนที่เพื่อแมปตารางฐานข้อมูล SQL Server กับวัตถุ. NET

  • Linq-to-Entitiesเป็นแนวคิดเดียวกัน แต่ใช้ Entity Framework ในพื้นหลังเป็น ORM - อีกครั้งจาก Microsoft แต่สนับสนุนแบ็กเอนด์ฐานข้อมูลหลายรายการ

  • Linq-to-DataSetsคือ LINQ แต่การใช้งานจะขัดกับชุดข้อมูล ADO.NET 2.0 "แบบเก่า" - ในช่วงเวลาก่อนที่ ORM จะมาจาก Microsoft สิ่งที่คุณทำได้กับ ADO.NET คือการส่งคืน DataSets, DataTables เป็นต้นและ Linq -to-DataSets สอบถามที่เก็บข้อมูลเหล่านั้นสำหรับข้อมูล ดังนั้นในกรณีนี้คุณจะส่งคืน DataTable หรือ DataSets (System.Data namespace) จากแบ็กเอนด์ฐานข้อมูลจากนั้นสอบถามข้อมูลเหล่านั้นโดยใช้ไวยากรณ์ LINQ


1
ขอแสดงความยินดีกับ 50k ตอนนี้คุณใช้เวลาอย่างเป็นทางการมากเกินไปกับ StackOverflow ;)
Aaronaught

1
@Aaronaught: ขอบคุณ - และคุณพูดถูกจริงๆ! :-) ต้องออกจากหนึ่งติดยาเสพติดให้ทุกคนไม่? กรุณา?!?!?!
marc_s

1
marc_s ขอบคุณสำหรับคำตอบนี้ คุณช่วยบอกบางอย่างเกี่ยวกับประสิทธิภาพ จากคำตอบของคุณฉันเดาได้ว่า Linq-to-Entities นั้นก้าวหน้าที่สุดและอาจมีประสิทธิภาพมากที่สุด?
Marcel

2
@Marcel: จากลำไส้ของฉัน (ไม่มีข้อเท็จจริงที่ยาก) ฉันจะพูดว่า: Linq-to-SQL หรือเร็วที่สุด (มีเพียงเลเยอร์เดียวระหว่างฐานข้อมูลและโมเดลวัตถุ) Linq-to-Dataset ใกล้ ๆ วินาทีและ Linq-to -Entities เป็นอันดับสุดท้ายเนื่องจาก Entity Framework จะมีการแมปสองชั้นเสมอ (จึงมีความซับซ้อนมากที่สุด) แต่อีกครั้ง: เป็นเพียงความรู้สึกที่ไม่ดีไม่มีตัวเลขให้สำรอง
marc_s

3
@marc_s ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ LINQ to Entities น่าจะเร็วกว่า LINQ ไปยัง Dataset ในกรณีส่วนใหญ่ LINQ เป็นชุดข้อมูลไม่ใช่ประเภทจริงๆ แต่เป็น LINQ เหนือวัตถุที่คุณใช้ชุดข้อมูลเป็นวัตถุ เนื่องจาก LINQ บนออบเจ็กต์ไม่ได้ทำ SQL ใด ๆ ก่อนอื่นคุณต้องสร้างชุดข้อมูลของคุณจากแหล่งที่มาของ SQL และ LINQ บนวัตถุไม่สามารถช่วยคุณดำเนินการเพิ่มประสิทธิภาพแบบสอบถามใด ๆ ในการดึงข้อมูลลงในชุดข้อมูล ชุดข้อมูลนั้นมีประสิทธิภาพที่แย่มากเนื่องจากคอลัมน์ทั้งหมดอยู่ในกล่องและการเปลี่ยนประเภททั้งหมดจะฆ่าประสิทธิภาพ
Robert McKee

38

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 ที่เขียนดีซึ่งส่งคืนข้อมูลจำนวนเล็กน้อยนั้นเร็วกว่าการโหลดฐานข้อมูลทั้งหมดผ่านเครือข่ายจากนั้นกรองที่ไคลเอนต์ ทั้งสองมีสถานการณ์ในอุดมคติและสถานการณ์ที่ผิดธรรมดา

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


Marc ขอบคุณสำหรับข้อมูลเชิงลึกนี้ อย่างไรก็ตามฉันไม่ได้ถามเกี่ยวกับรายละเอียดภายใน -1 ฉันขอโทษเพราะมันไม่ตอบคำถาม
Marcel

7
ในฐานะที่มีคนเขียนผู้ให้บริการ LINQ ของเขาเองนี่คือคำตอบที่ดีที่สุดที่ฉันเคยเห็นมา ฉันไม่เห็นด้วยเกี่ยวกับ -1
Dan Barowy

30

LINQ ย่อมาจากคำสืบค้นรวมภาษา ช่วยให้คุณสามารถใช้ภาษาแบบสอบถาม "สไตล์ SQL" ได้โดยตรงภายใน C # เพื่อดึงข้อมูลจากแหล่งข้อมูล

  • แหล่งข้อมูลนั้นอาจเป็นฐานข้อมูลเซิร์ฟเวอร์ SQL - นี่คือLinq เป็น SQL
  • แหล่งข้อมูลที่อาจจะเป็นข้อมูลบริบทของวัตถุกรอบนิติบุคคล - Linq ไปยังหน่วยงาน
  • แหล่งข้อมูลที่อาจจะ ADO.net ชุดข้อมูล - Linq เพื่อชุดข้อมูล

แหล่งข้อมูลที่ยังอาจจะเป็นไฟล์ XML - Linq เพื่อ XML
หรือแม้เพียงแค่ชั้นเก็บของวัตถุธรรมดา - Linq วัตถุ

LINQ อธิบายถึงเทคโนโลยีการสืบค้นข้อมูลส่วนที่เหลือของชื่อจะอธิบายแหล่งที่มาของข้อมูลที่กำลังสอบถาม

สำหรับพื้นหลังเพิ่มเติมเล็กน้อย:

ชุดข้อมูลคือออบเจ็กต์ ADO.net ที่โหลดข้อมูลจากฐานข้อมูลลงใน. net Dataset และ Linq สามารถใช้เพื่อสอบถามข้อมูลนั้นหลังจากโหลด

ด้วยLinq เป็น SQLคุณกำหนดคลาส. net ที่แมปกับฐานข้อมูลและ Linq-to-SQL จะดูแลการโหลดข้อมูลจากฐานข้อมูลเซิร์ฟเวอร์ SQL

และสุดท้ายเอนทิตีเฟรมเวิร์กคือระบบที่คุณสามารถกำหนดฐานข้อมูลและการแม็พอ็อบเจ็กต์ใน XML จากนั้นสามารถใช้ Linq เพื่อสืบค้นข้อมูลที่โหลดผ่านการแม็ปนี้


3
จริงๆแล้ว Linq-to-SQL คือSQL Serverเท่านั้นไม่ใช่แค่แบ็กเอนด์ฐานข้อมูล SQL "ใด ๆ "
marc_s

3
@marc_s: จุดที่ดี ขอบคุณ. แม้ว่าหากใครสนใจก็มีผู้ให้บริการ Linq to sql ของบุคคลที่สามสำหรับฐานข้อมูลอื่น ๆ หากคุณต้องการ โปรดดูcode2code.net/DB_Linqหรือ Google สำหรับผู้อื่น ฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับคุณภาพของพวกเขาได้
Simon P Stevens

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