Sử dụng Bao gồm trong Entity Framework 4 với biểu thức lambda


88

Tôi đã xem nhiều bài viết về cách khắc phục vấn đề này, tất cả đều liên quan đến CTP4, Hoặc thêm các phương pháp mở rộng của riêng tôi.

Có một cách bao gồm EF4 "chính thức" để sử dụng các biểu thức lambda bên trong bao gồm (cho cả quan hệ cấp độ đầu tiên và cấp độ thứ 2 trở lên) hay cuối cùng nó không được đưa vào RTM?

Đó là một điều - Tôi rất vui khi học cách làm điều đó, vì việc sử dụng biểu thức lambda trong mã của tôi bây giờ (với # system.data.entity # system.data.linq) vẫn mang lại cho tôi:

Không thể chuyển đổi biểu thức lambda thành kiểu 'chuỗi' vì nó không phải là kiểu đại biểu trên:

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

1
không, nó không tồn tại (ngoài CTP4 - như bạn nói). Tôi sử dụng các phương thức mở rộng / enums để đạt được kiểu an toàn.
RPM1984

Tôi cũng đã làm điều đó, vì vậy MS đưa nó vào CTP4 và loại bỏ nó trong RTM?
Dani

Câu trả lời:


229

Phiên bản RTM của Entity Framework 4.1 thực sự bao gồm các phương thức mở rộng trong EntityFramework.dlltệp, để tải nhanh với lambda thông qua Includehàm. Chỉ cần đưa DLL vào dự án của bạn và bạn sẽ có thể viết mã như:

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

Hãy nhớ thêm câu lệnh Nhập / Sử dụng để bao gồm không gian tên System.Data.Entity . Nếu không, trình biên dịch không thể tìm thấy các phương thức mở rộng. Ví dụ:

using System.Data.Entity;

Xem bài viết này trên blog của nhóm ADO.NET để biết thêm thông tin.


1
Mặc dù liên kết đến blog ADO.net vẫn có liên quan, nhưng tài liệu tham khảo / hướng dẫn EF6 cho cùng chủ đề là: Đang tải các Đối tượng liên quan Tôi nghĩ tài liệu cần chuyển sang các ví dụ về Princess và Unicorn thay vì Blog và Bài đăng mà họ đã sử dụng mọi nơi.
Arkaine55

1
cảm ơn, tôi chỉ cần thêm bằng cách sử dụng System.Data.Entity; nó làm việc cho tôi.
adnan

liên kết blog của nhóm đã chết, đây là địa điểm mới
Nintynuts

89

Mặc dù điều này được ngụ ý trong câu hỏi, đối với bất kỳ ai khác gặp vấn đề tương tự khi họ không thể sử dụng lambdas với .Include, hãy đảm bảo rằng bạn có điều này:

using System.Data.Entity;

5

Hiện tại, không có hỗ trợ chính thức cho Bao gồm với biểu thức lambda trong RTM. Tôi đang sử dụng cái này .

Khi chúng ta nói về CTP4, chúng ta có nghĩa là Tính năng Khung thực thể. Nó là API mới hơn EF4. Nó chủ yếu bao gồm Code First và một số cải tiến khác.


Bất kỳ ý tưởng khi MS sẽ hỗ trợ tính năng này? Tôi hiểu rằng tất cả các phương thức mở rộng này đều có vấn đề về hiệu suất với đối tượng lớn / đa cấp - vì chúng cần phải duyệt đi xem lại mỗi lần gọi bao gồm và trong khi cây "định nghĩa" đối tượng là không đổi và có thể được lưu vào bộ nhớ cache, không có giải pháp nào như điều này được nêu ra.
Dani

Tính năng Khung thực thể hiện có trong CTP5. Tôi đoán phiên bản RTM sẽ được hoàn thiện trong quater đầu tiên của năm 2011. Vì vậy, hy vọng nó sẽ chứa Bao gồm với biểu thức lambda nhưng tôi chưa kiểm tra việc triển khai của nó nên tôi không thể nói liệu nó có sử dụng bất kỳ loại bộ nhớ đệm nào hay không.
Ladislav Mrnka

31
Câu trả lời này sai đối với EF 4.3.x. Các câu trả lời khác là đúng, người ta phải sử dụng System.Data.Entity để nhận quá tải với các biểu thức lamda.
Eric J.

1
@EricJ: Vâng. Bao gồm được đánh máy mạnh có sẵn kể từ EF 4.1.
Ladislav Mrnka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.