Entity Framework vs LINQ ไปยัง SQL


828

ตอนนี้. NET v3.5 SP1 ได้รับการเผยแพร่ (พร้อมกับ VS2008 SP1) ตอนนี้เราสามารถเข้าถึง. NET Framework นิติบุคคล

คำถามของฉันคือสิ่งนี้ เมื่อพยายามที่จะตัดสินใจระหว่างการใช้ Entity Framework และ LINQ กับ SQL เป็น ORM ความแตกต่างคืออะไร?

วิธีที่ฉันเข้าใจ Framework Entity (เมื่อใช้กับ LINQ ไปยังเอนทิตี) เป็น 'พี่ใหญ่' กับ LINQ ไปยัง SQL? หากเป็นเช่นนี้ - มีข้อดีอะไรบ้าง มันสามารถทำอะไรได้บ้างที่ LINQ กับ SQL ไม่สามารถทำได้ด้วยตัวเอง?


138
ฉันคิดว่าคำตอบด้านล่างควรได้รับการตรวจสอบอีกครั้งเพราะเป็นเวลานานนับตั้งแต่ที่ EF เปิดตัวดังนั้นนักพัฒนาใหม่ที่มาที่นี่จะได้รับความประทับใจที่ผิด EF กลายเป็นเครื่องมือที่ยอดเยี่ยมและง่ายตั้งแต่เปิดตัวครั้งแรก คุณเพิ่งตั้งค่าการเชื่อมต่อกับฐานข้อมูลและเป็น 90% ของทั้งหมดที่คุณต้องการ การพัฒนาอย่างรวดเร็วมากจากมุมมองที่มีประสบการณ์! จากนั้น - LINQ เป็นเพื่อนที่ดีที่สุดของคุณ มันปรับแต่งได้สูง MVC เพียงแค่ชอบและคนที่พูดว่าไม่ดี - เรียนรู้วิธีใช้งานก่อน (และรับไว้กับ LINQ ด้วย)!
graumanoz

10
มันชัดเจน - ไม่ใช่อย่างที่คุณมีทางเลือกตอนนี้ - MSFT ฆ่า LINQ2SQL อย่างมีประสิทธิภาพเพื่อประโยชน์ของ EF อย่างไรก็ตามความจริงที่ว่า MSFT ที่มาจาก EF ช่วยให้มันดูดน้อยลงและดีขึ้นอย่างแน่นอน แต่สำหรับทุกคนที่เข้าเรียนในโรงเรียน EF - ต้องแน่ใจว่าเข้าใจว่ายังมีข้อสงสัยมากมายใน EF ฉันโพสต์ประมาณหนึ่งรายการ - stackoverflow.com/questions/305092/…
nikib3ro

4
@ kape123, (a) LINQ ไปยัง SQL ไม่ "ตาย"; มันยังคงใช้งานได้; (b) LINQ to SQL เป็นวิธีการเข้าถึงข้อมูลมาตรฐานในการพัฒนา Windows Phone 8
Ryan Lundy

9
@ user3308043 [จำเป็นต้องมี]
Ryan Lundy

3
@ Kyralessa - ณ ปี 2010 (ด้วยการเปิดตัว. NET4.0, การอ้างอิงล่าสุดที่ฉันหาได้), MS ยอมรับว่าในขณะที่การลงทุนบางส่วนอาจทำใน LINQ2SQL "การลงทุนโดยรวมของเราส่วนใหญ่จะอยู่ใน Entity กรอบ."
kmote

คำตอบ:


483

LINQ ไปยัง SQL รองรับการแมปตารางฐานข้อมูลมุมมอง sprocs และฟังก์ชั่นที่มีอยู่ใน Microsoft SQL Server เท่านั้น มันเป็น API ที่ยอดเยี่ยมที่ใช้สำหรับการสร้างการเข้าถึงข้อมูลอย่างรวดเร็วไปยังฐานข้อมูล SQL Server ที่ออกแบบมาค่อนข้างดี LINQ2SQL เปิดตัวครั้งแรกกับ C # 3.0 และ. Net Framework 3.5

LINQ to Entities (ADO.Net Entity Framework) เป็น ORM (Object Relational Mapper) API ซึ่งช่วยให้คำจำกัดความกว้างของโมเดลโดเมนวัตถุและความสัมพันธ์กับผู้ให้บริการข้อมูล ADO.Net ที่แตกต่างกัน ดังนั้นคุณสามารถผสมและจับคู่ผู้จำหน่ายฐานข้อมูลแอพพลิเคชันเซิร์ฟเวอร์หรือโพรโทคอลต่าง ๆ จำนวนมากเพื่อออกแบบการรวมกันของออบเจ็กต์ที่สร้างขึ้นจากตารางแหล่งที่มาการบริการ ฯลฯ ADO.Net Framework เปิดตัวด้วย .Net Framework 3.5 SP1

นี่เป็นบทความเบื้องต้นที่ดีเกี่ยวกับ MSDN: แนะนำ LINQ กับข้อมูลเชิงสัมพันธ์


ดูเหมือนว่าคุณใช้ LINQ กับ SQL เพื่อสอบถามใน EF
PositiveGuy

11
@CoffeeAddict ในขณะที่มีลักษณะคล้ายกันมากโดยใช้ lambdas LINQ แต่ละ API มีการสนับสนุนที่แตกต่างกันโดยสิ้นเชิง ยกตัวอย่างเช่น Linq2Sql วิธีการสร้างแบบสอบถาม SQL ช่วยให้การใช้ฟังก์ชั่น SQL ในขณะที่ L2E ไม่ได้หรืออย่างน้อยไม่ได้เป็นของปี 2008
คริส

2
วิธีการเชิงวัตถุของ EF ทำให้การใช้งานง่ายและสะดวกสบายสามารถเขียนโค้ดได้อย่างรวดเร็วและจัดการได้ สำหรับฉันแล้วเป็นวิธีที่ดีที่สุดในการเข้าถึงข้อมูล
Antoine Pelletier

10
คำตอบนี้ล้าสมัยแล้ว ตอนนี้ Linq กับ SQL รองรับการทำแผนที่หนึ่งครั้งจำนวนมาก
George Lanetz

201

ฉันคิดว่าคำตอบที่รวดเร็วและสกปรกก็คือ

  • LINQ to SQL เป็นวิธีที่ทำได้ง่ายและรวดเร็ว ซึ่งหมายความว่าคุณจะไปได้เร็วขึ้นและส่งมอบได้เร็วขึ้นหากคุณกำลังทำอะไรที่เล็กกว่า
  • Entity Framework เป็นวิธีที่ไม่มีข้อ จำกัด ในการดำเนินการ ซึ่งหมายความว่าคุณจะต้องใช้เวลามากขึ้นพัฒนาช้าลงและมีความยืดหยุ่นมากขึ้นถ้าคุณทำงานกับสิ่งที่ใหญ่กว่า

32
คุณมักจะเขียนโค้ดน้อยลงด้วย L2S เพื่อทำสิ่งเดียวกันกับที่คุณทำกับ EF ไม่มีการโหลดที่ขี้เกียจใน EF หมายความว่าคุณจะตรวจสอบเสมอว่ามีบางสิ่งที่โหลดหรือไม่
Paul Mendoza

แบรดคุณอยากแนะนำอะไรเกี่ยวกับเว็บไซต์อีคอมเมิร์ซ ฉันหมายความว่าฉันไม่เห็นอะไรนอกจาก CRUD ธรรมดา ๆ ที่เกิดขึ้นที่นั่น ...
PositiveGuy

2
@CoffeeAddict เห็นได้ชัดว่าคำตอบที่ได้รับการโหวตมากที่สุด 3 อันดับแรกบอกว่า L2S สำหรับ CRUD อย่างง่าย
IsmailS

11
@Banford กับ EF ใน. NET 4.0 ฉันคิดว่ามันดีกว่า L2S ฟีเจอร์ที่หายไปจาก EF ใน 3.5 ที่ L2S ได้ถูกเพิ่มเข้าไปใน EF ใน. NET 4.0 ข้อความสั่ง LINQ ของคุณตอนนี้ใน EF ใน. NET 4.0 กำลังจะดูคล้ายกับ L2S EF ทำให้คุณได้รับสิ่งพิเศษที่คุณสามารถทำได้เหนือสิ่งที่ L2S เสนอให้
Paul Mendoza

40
คำตอบนี้มีอายุ 5 ปีและค่อนข้างล้าสมัย Entity Framework 6 ตอนนี้อยู่ในรุ่นเบต้าและได้รับการปรับปรุงให้ดีขึ้นมากรวมถึงการโหลด Lazy การสนับสนุน Enum ฯลฯ และอื่น ๆ
Tim

109

LINQ กับ SQL นั้นตายแล้วจริงหรือ โดย Jonathan Allen สำหรับ InfoQ.com

Matt Warren อธิบายว่า [LINQ to SQL] เป็นสิ่งที่ "ไม่ควรมีอยู่" โดยพื้นฐานแล้วมันควรจะยืนอยู่เพื่อช่วยพัฒนา LINQ จนกว่า ORM จริงจะพร้อม

...

มาตราส่วนของเอนทิตี Framework ทำให้พลาดกำหนดเวลาของ. NET 3.5 / Visual Studio 2008 มันเสร็จสมบูรณ์ในเวลาที่น่าเสียดายที่ชื่อ ". NET 3.5 Service Pack 1" ซึ่งเป็นเหมือนรุ่นใหญ่กว่าเซอร์วิสแพ็ค

...

นักพัฒนาไม่ชอบ [ADO.NET Entity Framework] เนื่องจากความซับซ้อน

...

ตั้งแต่. NET 4.0, LINQ to Entities จะเป็นโซลูชันการเข้าถึงข้อมูลที่แนะนำสำหรับ LINQ กับสถานการณ์เชิงสัมพันธ์


56
ที่จริงแล้วเราไม่ชอบโรงเรียน EF เพราะมีนักออกแบบที่น่าสงสารและเป็นคนที่บั๊กกี้อย่างมาก ฉันไม่เคยพบว่ามันซับซ้อนทั้งหมด
BlueRaja - Danny Pflughoeft

12
ไซต์อีคอมเมิร์ซที่สำคัญจำนวนมากใช้ LINQ กับ SQL ตัวอย่าง: Redbox, Stackoverflow ฯลฯ
PositiveGuy

14
ฉันรู้ว่านักพัฒนาที่ดีจำนวนมากที่ใช้ LINQ กับ SQL และพูดว่าบทความเหล่านี้ล้นเหลือโดยสิ้นเชิง ฉันเห็นด้วย. LINQ ไปยัง SQL ถูกใช้งานใน. com ที่ทรงพลังและยังคงเป็น
PositiveGuy

4
ใช่เรียก. ToString () ในคุณสมบัติจำนวนเต็มในแบบสอบถาม L2EF ไม่ควรทำให้เกิดข้อยกเว้น
StingyJack

3
@ BlueRaja-DannyPflughoeft ยังคงเป็นจริงหลังจากนานกว่า 5 ปีหรือไม่?
Vikas Rana

94

มีความแตกต่างที่ชัดเจนที่ระบุไว้ในบทความ @lars ที่โพสต์ แต่คำตอบสั้น ๆ คือ:

  • L2S มีการรวมกันอย่างแน่นหนา - คุณสมบัติวัตถุกับเขตข้อมูลเฉพาะของฐานข้อมูลหรือการแมปวัตถุอย่างถูกต้องกับสคีมาฐานข้อมูลเฉพาะ
  • L2S จะทำงานกับ SQL Server เท่านั้น (เท่าที่ฉันรู้)
  • EF อนุญาตให้ทำแผนที่ชั้นเดียวกับหลายตาราง
  • EF จะจัดการกับความสัมพันธ์ MM
  • EF จะมีความสามารถในการกำหนดเป้าหมายผู้ให้บริการข้อมูล ADO.NET

สถานที่ตั้งเดิมคือ L2S สำหรับการพัฒนาอย่างรวดเร็วและ EF สำหรับแอปพลิเคชัน n-tier ระดับ“ enterprisey” เพิ่มเติม แต่ที่ขาย L2S เพียงเล็กน้อย


13
คำพูดของคุณ "L2S จะทำงานกับ SQL Server (เท่าที่ฉันรู้)" จำเป็นต้องได้รับการอัปเดต: โครงการโอเพ่นซอร์ส "dblinq" แทนที่ LINQ ไปเป็นชุดประกอบ SQL ด้วยหนึ่งที่สามารถพูดคุยกับ MySQL, PostgreSQL, Ingres, Firebird, SQLite .. และ Microsoft SQL (แน่นอน)
Contango

1
เดี๋ยวก่อน ... ดังนั้น EF จึงไม่สร้างวัตถุ DL คู่กันอย่างแน่นหนา?
PositiveGuy

7
แท้จริงแล้วหลักฐานดั้งเดิมที่ L2S ไม่ใช่โซลูชันที่รองรับสำหรับองค์กรนั้นไม่เป็นความจริงอีกต่อไป ฉันหมายถึง StackOverflow รันบน L2S และคอมอื่น ๆ อีกมากมายเช่น Redbox และอีกมากมาย
PositiveGuy

74

LINQ เป็น SQL

  1. แหล่งข้อมูลที่เป็นเนื้อเดียวกัน: SQL Server
  2. แนะนำสำหรับโครงการขนาดเล็กที่ออกแบบโครงสร้างข้อมูลได้ดีเท่านั้น
  3. การแมปสามารถเปลี่ยนแปลงได้โดยไม่ต้อง recompilling กับ SqlMetal.exe
  4. .dbml (ภาษามาร์กอัปฐานข้อมูล)
  5. การทำแผนที่แบบหนึ่งต่อหนึ่งระหว่างตารางและคลาส
  6. รองรับการถ่ายทอดTPH
  7. ไม่รองรับประเภทที่ซับซ้อน
  8. วิธีการเก็บข้อมูลครั้งแรก
  9. มุมมองฐานข้อมูลเป็นศูนย์กลางของฐานข้อมูล
  10. สร้างโดยทีม C #
  11. สนับสนุน แต่ไม่ได้รับการปรับปรุงเพิ่มเติม

Entity Framework

  1. แหล่งข้อมูล Heterogeneus: สนับสนุนผู้ให้บริการข้อมูลจำนวนมาก
  2. แนะนำสำหรับโครงการใหม่ทั้งหมดยกเว้น:
    • อันเล็ก (LINQ ถึง SQL)
    • เมื่อแหล่งข้อมูลเป็นไฟล์แบบแฟลต (ADO.NET)
  3. การแม็พสามารถเปลี่ยนแปลงได้โดยไม่ต้องทำการคำนวณซ้ำเมื่อตั้งค่าโมเดลและการแม็พไฟล์ Metadata Artifact Process ไปที่ Copy to Output Directory
  4. . edmx (โมเดลข้อมูลเอนทิตี) ซึ่งมี:
    • SSDL (ภาษาคำจำกัดความของโครงสร้างหน่วยเก็บข้อมูล)
    • CSDL (ภาษานิยามของสคีมาแนวคิด)
    • MSL (ภาษาสเปคการทำแผนที่)
  5. การแมปแบบหนึ่งต่อหนึ่งแบบตัวต่อตัวและแบบตัวต่อตัวระหว่างตารางและคลาส
  6. รองรับการสืบทอด:
    • TPH (ตารางต่อลำดับชั้น)
    • TPT (ตารางต่อประเภท)
    • TPC (ตารางต่อระดับคอนกรีต)
  7. รองรับประเภทที่ซับซ้อน
  8. วิธีการรหัสแรกรุ่นแรกวิธีการจัดเก็บครั้งแรก
  9. มุมมองแอปพลิเคชันเป็นศูนย์กลางของฐานข้อมูล
  10. สร้างโดยทีม SQL Server
  11. อนาคตของ Microsoft Data APIs

ดูสิ่งนี้ด้วย:


6
นี่คือคำตอบที่เป็นปัจจุบันและละเอียดที่สุด
ErTR

2
ไม่ Entity Framework ใช้ LINQ กับ SQL เมื่อบอกว่าคุณกำลังเขียนdbSet<Orders>.Where()...ToList()? ฉันคิดว่ามันทำให้เข้าใจผิดว่ามี Entity Framework ซึ่งตรงกันข้ามกับ LINQ ไปยัง SQL
Don Cheadle

4
@mmcrae EF ไม่ได้ใช้ L2S ทั้งคู่เป็นผู้ให้บริการ linq กับฐานข้อมูลพื้นฐาน หากคุณตีความว่าเป็น Linq-to-a-database คล้ายกับ linq-to-objects และ linq-to-xml ดังนั้นใช่ทั้งสองจะคล้ายกันใน linq-to-a-database แต่ไม่ EF ไม่ใช้ L2S (หรือกลับกัน) เครื่องมือสองชิ้นที่แยกจากกันโดยสิ้นเชิง
Maarten

4
"แนะนำสำหรับโครงการใหม่ทั้งหมดยกเว้น ... โครงการเล็ก" ฉันไม่เห็นด้วย Code First เป็นวิธีที่รวดเร็วอย่างยิ่งในการทำงานให้กับโครงการขนาดเล็ก นอกเหนือจากนั้นโปรดอัปเดตคำถามนี้ให้ดี
DrewJordan

51

ประสบการณ์ของฉันกับ Entity Framework น้อยกว่าตัวเอก ก่อนอื่นคุณต้องสืบทอดจากชั้นเรียนพื้นฐานของ EF ดังนั้นบอกลากับ POCO ได้ การออกแบบของคุณจะต้องอยู่ใกล้กับ EF ด้วย LinqtoSQL ฉันสามารถใช้วัตถุธุรกิจที่มีอยู่ได้ นอกจากนี้ไม่มีการโหลดขี้เกียจคุณต้องใช้ตัวเอง มีงานบางส่วนที่ต้องใช้ POCO และการโหลดแบบสันหลังยาว แต่ก็มี IMHO เพราะ EF ยังไม่พร้อม ฉันวางแผนที่จะกลับมาหลังจาก 4.0


7
การขาดการสนับสนุน POCO เป็นสาเหตุอันดับหนึ่งที่ฉันเลือก LINQ ไปยัง SQL ผ่าน Entity Framework ฉันอาจกลับมาที่ EF อีกครั้งเมื่อพวกเขารวมมันไว้ในรุ่นถัดไปตามที่พวกเขาสัญญา มีบางโครงการเพิ่มเติมที่ทำที่ POCO สำหรับ EF แต่ไม่สะอาดพอ
Joseph Ferris

27
ในกรณีที่มีคน (เช่นฉัน) ไม่รู้ว่า POCO หมายถึงอะไร: Plain Old CLR Object
CBono

4
ฉันไม่เห็นว่าเอะอะใหญ่ ๆ ที่ไม่สนับสนุน POCO คืออะไร ... มันเป็นอีกระดับหนึ่งของคนที่เป็นนามธรรม สร้างโรงงานฉีดที่เก็บข้อมูลและสร้าง POCO ของคุณที่นั่น มันอาจเป็นความคิดที่ดีอยู่ดี
EightyOne Unite

3
ฉันได้ยินว่า POCO เป็นไปได้ใน EF 4
PositiveGuy

8
สนับสนุน POCO สามารถใช้ได้วันนี้และมรดกไม่เป็นความต้องการสำหรับการเรียนนิติบุคคล @CoffeeAddict POCO เป็นเพียงวัตถุที่เรียบง่ายกับความเชื่อมั่นในกรอบที่เฉพาะเจาะจงและเป็นส่วนหนึ่งที่สำคัญของรูปแบบกรอบนิติบุคคลที่ทันสมัย
คริส McGrath

46

ฉันพบคำตอบที่ดีมากที่นี่ซึ่งจะอธิบายเมื่อใช้สิ่งที่เป็นคำง่าย:

กฎพื้นฐานง่ายๆที่กรอบการใช้คือวิธีการวางแผนในการแก้ไขข้อมูลของคุณในเลเยอร์การนำเสนอของคุณ

  • Linq-To-Sql - ใช้เฟรมเวิร์กนี้หากคุณวางแผนที่จะแก้ไขความสัมพันธ์แบบหนึ่งต่อหนึ่งของข้อมูลของคุณในเลเยอร์การนำเสนอของคุณ หมายความว่าคุณไม่ได้วางแผนที่จะรวมข้อมูลจากมากกว่าหนึ่งตารางในมุมมองหรือหน้าเดียว

  • Entity Framework - ใช้เฟรมเวิร์กนี้หากคุณวางแผนที่จะรวมข้อมูลจากมากกว่าหนึ่งตารางในมุมมองหรือหน้าของคุณ เพื่อให้ชัดเจนยิ่งขึ้นคำศัพท์ด้านบนเป็นข้อมูลเฉพาะที่จะได้รับการจัดการในมุมมองหรือหน้าของคุณไม่ใช่แค่แสดง นี่เป็นสิ่งสำคัญที่จะเข้าใจ

ด้วย Entity Framework คุณจะสามารถ "รวม" ข้อมูลตารางไว้ด้วยกันเพื่อนำเสนอไปยังเลเยอร์การนำเสนอในรูปแบบที่แก้ไขได้และเมื่อส่งแบบฟอร์มนั้นแล้ว EF จะทราบวิธีอัปเดตข้อมูลทั้งหมดจากตารางต่างๆ

อาจมีเหตุผลที่แม่นยำมากกว่าในการเลือก EF ใน L2S แต่สิ่งนี้อาจเป็นวิธีที่เข้าใจง่ายที่สุด L2S ไม่มีความสามารถในการรวมข้อมูลเพื่อดูงานนำเสนอ


36

ความประทับใจของฉันคือฐานข้อมูลของคุณค่อนข้าง enourmous หรือออกแบบมาไม่ดีถ้า Linq2Sql ไม่ตรงกับความต้องการของคุณ ฉันมีเว็บไซต์ประมาณ 10 เว็บไซต์ทั้งใหญ่และเล็กลงทั้งหมดใช้ Linq2Sql ฉันได้ดูและเอนทิตีเฟรมเวิร์กหลายครั้ง แต่ฉันไม่สามารถหาเหตุผลที่ดีสำหรับการใช้งานมากกว่า Linq2Sql ที่กล่าวว่าฉันพยายามใช้ฐานข้อมูลของฉันเป็นแบบจำลองดังนั้นฉันจึงมีการแมป 1 ถึง 1 ระหว่างโมเดลและฐานข้อมูล

ที่งานปัจจุบันของฉันเรามีฐานข้อมูลที่มีมากกว่า 200 ตาราง ฐานข้อมูลเก่าที่มีวิธีแก้ปัญหาที่ไม่ดีดังนั้นฉันจึงเห็นประโยชน์ของ Entity Framework บน Linq2Sql แต่ฉันยังคงต้องการออกแบบฐานข้อมูลใหม่เนื่องจากฐานข้อมูลเป็นเอ็นจิ้นของแอปพลิเคชันและถ้าฐานข้อมูลได้รับการออกแบบและช้า จะช้าเช่นกัน การใช้กรอบงานของเอนทิตี้ในฐานข้อมูลนั้นดูเหมือนว่า Quickfix จะซ่อนตัวแบบที่ไม่ดี แต่มันก็ไม่สามารถปิดบังประสิทธิภาพที่ไม่ดีที่คุณได้รับจากฐานข้อมูลนั้นได้


1
จุดที่ขาดหายไปของคุณ - แม้จะมีฐานข้อมูลขนาดเล็กคุณอาจต้องการบางสิ่งที่แตกต่างจากความสัมพันธ์แบบ 1: 1 ระหว่างตารางฐานข้อมูลกับโค้ดวัตถุ / โดเมน ขึ้นอยู่กับว่าคุณต้องการนามธรรมในวัตถุรถบัส / โดเมน
เล่นแร่แปรธาตุ

18
ฉันรู้แล้วว่า :) วันนี้ฉันชอบส่งรหัสธุรกิจให้ฉัน ฉันยังคงใช้ Linq2sql แต่เฉพาะในที่เก็บของฉันที่ฉันได้รับข้อมูลโดยใช้ Linq2sql และแปลงหน่วยงาน linq2sql เป็นหน่วยงานธุรกิจที่กำหนดเองของฉัน อาจจะทำงานได้ดีกว่าการใช้ or-mapper แต่ฉันก็ยังต้องการให้เลเยอร์ธุรกิจของฉันปราศจากโค้ดเฉพาะ OR-mapper
terjetyl

25

2
บางสิ่งในคำตอบนั้นไม่ถูกต้อง ไม่จำเป็นต้องใช้ EDMX หากคุณใช้ Code First และฉันไม่เข้าใจว่า DI เข้ามาเล่นอย่างไรเมื่อคุณใช้ Code First
Maarten

1
นอกจากนี้ Linq ไปยัง SQL สามารถเติม DB จากคลาสโมเดลได้ด้วย ไม่แน่ใจว่ามันสามารถสร้างฐานข้อมูลเองได้หรือไม่ แต่การสร้างสคีมาและตารางจะอยู่ภายในความสามารถของ Linq กับ SQL
Tom Lint

ขอบคุณสำหรับคำตอบฉันคิดว่าสามารถใช้sqlmetal.exe docs.microsoft.com/en-us/dotnet/framework/tools/ ......เพื่อสร้างรหัส / การแมปจากฐานข้อมูลเมื่อใช้Linq to SQL
Vinod Srivastav

23

คำตอบที่นี่ได้กล่าวถึงความแตกต่างมากมายระหว่าง Linq2Sql และ EF แต่มีประเด็นสำคัญที่ไม่ได้รับความสนใจมากนัก: Linq2Sql รองรับ SQL Server เท่านั้นในขณะที่ EF มีผู้ให้บริการสำหรับ RDBMS ดังต่อไปนี้:

จัดหาให้โดย Microsoft:

  • ไดรเวอร์ ADO.NET สำหรับ SQL Server, OBDC และ OLE DB

ผ่านผู้ให้บริการบุคคลที่สาม:

  • MySQL
  • คำพยากรณ์
  • DB2
  • VistaDB
  • SQLite
  • PostgreSQL
  • Informix
  • U2
  • Sybase
  • Synergex
  • Firebird
  • Npgsql

เพื่อชื่อไม่กี่

สิ่งนี้ทำให้ EF เป็นนามธรรมการเขียนโปรแกรมที่มีประสิทธิภาพเหนือแหล่งข้อมูลเชิงสัมพันธ์ของคุณซึ่งหมายความว่านักพัฒนามีรูปแบบการเขียนโปรแกรมที่สอดคล้องกันในการทำงานกับโดยไม่คำนึงถึงแหล่งข้อมูลพื้นฐาน สิ่งนี้อาจมีประโยชน์มากในสถานการณ์ที่คุณกำลังพัฒนาผลิตภัณฑ์ที่คุณต้องการให้แน่ใจว่าจะทำงานร่วมกับ RDBMS ทั่วไปได้หลากหลาย

สถานการณ์อื่นที่สิ่งที่เป็นนามธรรมนั้นมีประโยชน์คือที่ที่คุณเป็นส่วนหนึ่งของทีมพัฒนาที่ทำงานกับลูกค้าหลายรายหรือหน่วยธุรกิจที่แตกต่างกันภายในองค์กรและคุณต้องการปรับปรุงประสิทธิภาพการทำงานของนักพัฒนาโดยลดจำนวน RDBMS ให้กลายเป็น คุ้นเคยกับการสนับสนุนแอพพลิเคชั่นที่หลากหลายที่ด้านบนของ RDBMS ที่แตกต่างกัน


15

ฉันพบว่าฉันไม่สามารถใช้หลายฐานข้อมูลในรูปแบบฐานข้อมูลเดียวกันเมื่อใช้ EF แต่ใน linq2sql ฉันสามารถเพียงแค่นำหน้าชื่อสกีมาด้วยชื่อฐานข้อมูล

นี่เป็นหนึ่งในเหตุผลที่ฉันเริ่มทำงานกับ linq2sql ฉันไม่รู้ว่า EF อนุญาตให้ใช้ฟังก์ชันนี้ได้หรือไม่ แต่ฉันจำได้ว่าการอ่านนั้นมีวัตถุประสงค์เพื่อไม่ให้มีการอนุญาต


12

หากฐานข้อมูลของคุณตรงไปตรงมาและเรียบง่าย LINQ to SQL จะทำ หากคุณต้องการเอนทิตีแบบลอจิคัล / ที่เป็นนามธรรมที่ด้านบนของตารางของคุณให้ไปที่ Entity Framework


4
Entity Framework อนุญาตให้มีเลเยอร์ของสิ่งที่เป็นนามธรรมด้านบนของฐานข้อมูล ปัญหากับผู้ทำแผนที่จำนวนมากหรือในวันนี้ (ในความคิดของฉัน) คือพวกเขามีการทำแผนที่ 1 ถึง 1 ระหว่างตารางและชั้นเรียน โมเดลฐานข้อมูลไม่ได้สะท้อนวิธีคิดของเราในแง่ของรูปแบบธุรกิจเสมอไป
senfo

วิ่งออกจากพื้นที่ อย่างไรก็ตามจากสิ่งที่ฉันพูดไปแล้วฉันขอยืนยันว่าคำตอบของคุณไม่สมบูรณ์
senfo

7
ฉันคิดว่านี่เป็นคำแนะนำที่ไม่ดีจริงๆ L2S นั้นดีโดยไม่คำนึงถึงความเรียบง่ายหรือความซับซ้อนของฐานข้อมูลของคุณ กับดักที่แท้จริงไม่ได้มีการแยกความกังวลที่เหมาะสม หากคุณพยายามผสานชั้นธุรกิจและชั้นการเข้าถึงข้อมูลของคุณและใช้วัตถุ Linqed up สำหรับทุกสิ่งคุณจะพบ L2S จำกัด แต่นั่นเป็นปัญหาของการออกแบบที่เรียบง่ายและเสาหินมากเกินไป L2S สร้าง DAL ที่ยอดเยี่ยมและหากคุณพิจารณาการสอบถามและยืนยันความกังวลแยกต่างหากจากกฎเกณฑ์ทางธุรกิจของคุณคุณจะช่วยตัวคุณเองได้หลายปัญหาในหลาย ๆ ด้านในระยะยาว
mattmc3

1
สิ่งนี้ไม่บอกอะไรเลย อะไรคือสิ่งที่ง่ายในแง่ของคุณ?
PositiveGuy

1
และสิ่งที่คุณหมายถึงเป็นตัวอย่างสำหรับความต้องการของ "ตรรกะ / นามธรรม" ใช่ฉันรู้ว่าสิ่งที่เป็นนามธรรม แต่เป็นตัวอย่างในบริบทของคุณโปรด ... ที่จะอธิบายให้ฉันสิ่งที่คุณพูด ... อธิบายมันไม่เพียงให้ฉันแสลงทั่วไป ... นั่นคือทั้งหมดที่เกี่ยวข้องกับการพูด คำเหล่านั้นดังนั้นฉันไม่มีเงื่อนงำสิ่งที่คุณหมายถึงโดยนี้
PositiveGuy

8

ยังไม่รองรับประเภทข้อมูล SQL 2008 ที่ไม่ซ้ำใคร ความแตกต่างจากมุมมองของฉันคือ Entity ยังมีโอกาสสร้างแบบจำลองรอบ ๆ ประเภทข้อมูลทางภูมิศาสตร์ของฉันในการเปิดตัวในอนาคตและ Linq ไปยัง SQL ถูกทอดทิ้งจะไม่มีวันเป็นไปได้

สงสัยว่าเกิดอะไรขึ้นกับ nHibernate หรือ OpenAccess ...


3
SQL Server 2008 Spatial datatypes (Open Geospatial Consortium OGS) ได้รับการสนับสนุนจาก Entity Framework 5 ผู้ให้บริการอื่น ๆ (Devart สำหรับ Oracle) ก็รองรับเช่นกัน ดูmsdn.microsoft.com/en-us/data/dn194325
subsci

6

ฉันคิดว่าถ้าคุณต้องการพัฒนาบางสิ่งอย่างรวดเร็วโดยไม่มีสิ่งแปลก ๆ อยู่ตรงกลางและคุณต้องการความสะดวกในการให้เอนทิตีแสดงตารางของคุณ:

Linq2Sql สามารถเป็นพันธมิตรที่ดีโดยใช้กับ LinQ ปลดปล่อยช่วงเวลาการพัฒนาที่ยอดเยี่ยม


4
"ไม่มีสิ่งแปลก ๆ อยู่ตรงกลาง" โอเคคุณหมายถึงอะไร ตัวอย่างของ "สิ่งที่อยู่ตรงกลาง"
PositiveGuy

มันจะเป็นการดีที่จะแก้ไขหรือลบคำตอบนี้มันไม่มีประโยชน์สำหรับการพัฒนาที่ทันสมัยและสามารถรับคนผิด
Giulio Caccin

6

ฉันทำงานให้กับลูกค้าที่มีโครงการขนาดใหญ่ที่ใช้ Linq-to-SQL เมื่อโครงการเริ่มต้นมันเป็นตัวเลือกที่ชัดเจนเพราะ Entity Framework ขาดคุณสมบัติที่สำคัญบางอย่างในเวลานั้นและประสิทธิภาพของ Linq-to-SQL นั้นดีกว่ามาก

ตอนนี้ EF ได้รับการพัฒนาและ Linq-to-SQL ขาดการสนับสนุน async ซึ่งยอดเยี่ยมสำหรับบริการที่ปรับขนาดได้สูง บางครั้งเรามีคำขอมากกว่า 100 คำขอต่อวินาทีและแม้ว่าเราจะปรับปรุงฐานข้อมูลของเราได้แล้วแบบสอบถามส่วนใหญ่ยังใช้เวลาหลายมิลลิวินาทีในการดำเนินการให้เสร็จสมบูรณ์ เนื่องจากการเรียกฐานข้อมูลแบบซิงโครนัสเธรดจะถูกบล็อกและไม่พร้อมใช้งานสำหรับการร้องขออื่น

เรากำลังคิดที่จะเปลี่ยนไปใช้ Entity Framework สำหรับคุณสมบัตินี้เท่านั้น เป็นเรื่องที่น่าเสียดายที่ Microsoft ไม่ได้ใช้การสนับสนุน async ใน Linq-to-SQL (หรือเป็นการเปิดแหล่งที่มาดังนั้นชุมชนจึงสามารถทำได้)

ภาคผนวกธันวาคม 2561: Microsoft กำลังก้าวไปสู่. NET Core และ Linq-2-SQL ไม่ได้รับการสนับสนุนบน. NET Core ดังนั้นคุณต้องย้ายไปที่ EF เพื่อให้แน่ใจว่าคุณสามารถย้ายไปที่ EF.Core ในอนาคต

นอกจากนี้ยังมีตัวเลือกอื่น ๆ ที่จะต้องพิจารณาเช่นLLBLGen มันเป็นโซลูชัน ORM ที่ครบกำหนดที่มีอยู่แล้วเป็นเวลานานและได้รับการพิสูจน์แล้วในอนาคตว่าเป็นโซลูชันข้อมูล MS (ODBC, ADO, ADO.NET, Linq-2-SQL, EF, EF.core)


2

Linq เพื่อ SQL

เป็นผู้ให้บริการที่รองรับ SQL Server เท่านั้น มันเป็นเทคโนโลยีการทำแผนที่การแมปตารางฐานข้อมูล SQL Server กับวัตถุ. NET เป็นความพยายามครั้งแรกของ Microsoft ที่ ORM - แมปวัตถุสัมพันธ์

Linq เพื่อกิจการ

เป็นความคิดเดียวกัน แต่ใช้ Entity Framework ในพื้นหลังเป็น ORM - อีกครั้งจาก Microsoft ซึ่งสนับสนุนฐานข้อมูลหลายข้อได้เปรียบหลักของกรอบงานนิติบุคคลคือนักพัฒนาสามารถทำงานบนฐานข้อมูลใด ๆ ไม่จำเป็นต้องเรียนรู้ไวยากรณ์เพื่อดำเนินการใด ๆ กับฐานข้อมูลที่แตกต่างกัน

ตามประสบการณ์ส่วนตัวของฉัน Ef ดีกว่า (ถ้าคุณไม่รู้เกี่ยวกับ SQL) ประสิทธิภาพใน LINQ นั้นเร็วขึ้นเล็กน้อยเมื่อเทียบกับเหตุผลของภาษา LINQ ที่เขียนด้วยภาษาแลมบ์ดา

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