การใช้รวมใน Entity Framework 4 ด้วยนิพจน์แลมบ์ดา


88

ฉันเคยเห็นบทความมากมายเกี่ยวกับวิธีเอาชนะเรื่องนี้ทั้งหมดที่เกี่ยวข้องกับ CTP4 หรือเพิ่มวิธีการขยายของฉันเอง

มี EF4 "อย่างเป็นทางการ" รวมถึงวิธีการใช้นิพจน์แลมบ์ดาภายใน include หรือไม่ (สำหรับทั้งความสัมพันธ์ระดับแรกและระดับ 2 ขึ้นไป) หรือในที่สุดก็ไม่รวมอยู่ใน RTM?

มีอยู่อย่างหนึ่ง - ฉันยินดีที่จะเรียนรู้วิธีการทำเช่นนี้เนื่องจากการใช้ lambda expression ในโค้ดของฉันตอนนี้ (ด้วย # system.data.entity # system.data.linq) ยังให้ฉัน:

ไม่สามารถแปลงนิพจน์แลมบ์ดาเป็นพิมพ์ 'สตริง' เนื่องจากไม่ใช่ประเภทผู้รับมอบสิทธิ์ใน:

var customers = from c in
context.Customers.Include(c=>c.Phone)

1
ไม่ไม่มีอยู่จริง (นอกเหนือจาก CTP4 - ตามที่คุณพูด) ฉันใช้วิธีการขยาย / enums เพื่อให้ได้ประเภทความปลอดภัย
RPM1984

ฉันก็ทำเช่นนั้นดังนั้น MS จึงรวมไว้ใน CTP4 และลบออกใน RTM?
Dani

คำตอบ:


230

Entity Framework 4.1 เวอร์ชัน RTM มีเมธอดส่วนขยายในEntityFramework.dllไฟล์เพื่อการโหลดด้วยแลมบ์ดาผ่านIncludeฟังก์ชัน เพียงรวม DLL ในโครงการของคุณคุณก็จะสามารถเขียนโค้ดได้เช่น:

var princesses1 = context.Princesses.Include(p => p.Unicorns).ToList();

อย่าลืมเพิ่มคำสั่งนำเข้า / ใช้เพื่อรวมเนมสเปซSystem.Data.Entity มิฉะนั้นคอมไพลเลอร์จะไม่พบวิธีการขยาย เช่น:

using System.Data.Entity;

ดูบทความบล็อกของทีม ADO.NETสำหรับข้อมูลเพิ่มเติม


1
แม้ว่าลิงก์ไปยังบล็อก ADO.net จะยังคงมีความเกี่ยวข้อง แต่การอ้างอิง / คำแนะนำของ EF6 สำหรับหัวข้อเดียวกันคือการโหลดเอนทิตีที่เกี่ยวข้องฉันคิดว่าเอกสารประกอบต้องเปลี่ยนไปใช้ตัวอย่าง Princess และ Unicorn แทนบล็อกและโพสต์ที่พวกเขาใช้ ทุกที่.
Arkaine55

1
ขอบคุณฉันเพิ่งเพิ่มโดยใช้ System.Data.Entity; มันทำงานฉัน
แอดนัน

ลิงก์บล็อกของทีมตายแล้วนี่คือตำแหน่งใหม่
Nintynuts

90

แม้ว่าจะมีความหมายโดยนัยในคำถาม แต่สำหรับใครก็ตามที่มีปัญหาเดียวกันกับที่ไม่สามารถใช้ lambdas ร่วมกับได้โปรดตรวจสอบว่าคุณมีสิ่งนี้:

using System.Data.Entity;

5

ไม่มีการสนับสนุนอย่างเป็นทางการสำหรับการรวมกับแลมบ์ดานิพจน์ใน RTM ในขณะนี้ ฉันใช้นี้

เมื่อเราพูดถึง CTP4 เราหมายถึง Entity Framework Feature เป็น API ใหม่กว่า EF4 ส่วนใหญ่ประกอบด้วย Code First และการปรับปรุงอื่น ๆ เล็กน้อย


มีความคิดเมื่อใดที่ MS จะรองรับคุณสมบัตินี้ ฉันเข้าใจว่าเมธอดส่วนขยายเหล่านี้ทั้งหมดมีปัญหาด้านประสิทธิภาพกับอ็อบเจ็กต์ขนาดใหญ่ / หลายระดับ - เนื่องจากต้องสำรวจซ้ำแล้วซ้ำอีกในแต่ละครั้งที่เรียกเพื่อรวมและในขณะที่ต้นไม้ "นิยาม" ของอ็อบเจ็กต์นั้นคงที่และสามารถแคชได้ แต่ก็ไม่มีวิธีแก้ปัญหาเช่น นี้ยัง.
Dani

ปัจจุบัน Entity Framework Feature อยู่ใน CTP5 ฉันเดาว่าเวอร์ชัน RTM ควรได้รับการปรับปรุงในไตรมาสแรกของปี 2011 ดังนั้นหวังว่ามันจะมีการรวมกับแลมบ์ดานิพจน์ แต่ฉันยังไม่ได้ตรวจสอบการใช้งานดังนั้นฉันจึงไม่สามารถพูดได้ว่ามันใช้แคชประเภทใด
Ladislav Mrnka

31
คำตอบนี้ไม่ถูกต้องเนื่องจาก EF 4.3.x คำตอบอื่น ๆ ถูกต้องต้องมีโดยใช้ System.Data.Entityเพื่อรับการโอเวอร์โหลดด้วยนิพจน์ lamda
Eric J.

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