2012-07-17 28 views
5

Chúng tôi đang sử dụng EF 4.3 Mã đầu tiên và có một mô hình đối tượng như vậy:Entity Framework bảng cho mỗi loại - chọn từ chỉ các cột kiểu cơ sở

class Content { } 

class Product:Content { } 

class News:Content { } 

Đây là những ánh xạ như Bảng mỗi loại.

Có các tình huống mà tôi chỉ muốn tải chỉ các cột thuộc bảng cơ sở, như nói danh sách tất cả các tiêu đề nội dung. Nhưng một truy vấn như

from c in Content 
where c.IsDeleted == false 
select c 

dẫn đến một số SQL thực sự khó chịu khi kết hợp với hai bảng kia. Có cách nào để buộc EF chỉ làm một lựa chọn từ bảng cơ sở mà không cần tham gia vào các bảng khác không?

Trả lời

3

TPT là vấn đề và truy vấn được tạo EF thường rất kém hiệu quả. Hơn nữa, kỳ vọng của bạn có lẽ không chính xác. LINQ-to-entity luôn trả về kiểu thực thể thực. Nó không thể trả về thể hiện của loại Content nếu bản ghi thực ra là một thực thể Product. Truy vấn của bạn chỉ có thể có hai ý nghĩa:

  • Trả lại tất cả các nội dung không bị xóa - điều này phải thực hiện kết hợp để nhanh chóng thực hiện đúng loại thực thể. Truy vấn sẽ trả về việc liệt kê các trường hợp Content, ProductNews.
  • Trả lại tất cả các trường hợp không bị xóa Content - điều này có thể một lần nữa thực hiện các phép nối để tạo nhanh các bản ghi được ánh xạ tới Content trực tiếp (không liên quan đến ProductNews). Không có bản ghi nào được ánh xạ tới Product hoặc News sẽ được trả về trong điều tra. Truy vấn này không thể thực hiện được với LINQ-to-entity - bạn cần sử dụng ESQL và toán tử OFTYPE ONLY.

Có vài điều bạn có thể thử:

  • Nâng cấp lên .NET 4.5 - có một số cải tiến cho TPT truy vấn
  • chiếu Trả lại tài sản thay vì Content - ProductNews cũng là nội dung do đó bạn sẽ không bao giờ nhận được truy vấn mà không tham gia nếu bạn trả về Content trường hợp từ truy vấn LINQ-to-entity
+0

Cảm ơn bạn phản ứng. Nâng cấp lên 4,5 là trong số các câu hỏi cho dự án hiện tại chúng tôi đang làm việc trên đó là nghĩa vụ phải đi sống vào tháng tới. Chúng tôi đang có kế hoạch để làm như vậy truy vấn với procs lưu trữ. – madaboutcode

Các vấn đề liên quan