Tôi có một số mã đã được nâng cấp gần đây từ EF 4.2 lên EF 5.0 (thực ra là EF 4.4 kể từ khi tôi chạy trên .Net 4.0). Tôi đã phát hiện ra rằng tôi phải thay đổi cú pháp truy vấn của mình và tôi tò mò là tại sao. Hãy để tôi bắt đầu với vấn đề.Tại sao EF 5.0 không hỗ trợ cú pháp EF 4.x LINQ này khi biên dịch thành sql?
Tôi có bảng EventLog được điền bởi máy khách theo định kỳ. Đối với mỗi bản ghi sự kiện, một mục được tạo trong bảng Báo cáo. Đây là truy vấn chạy theo định kỳ để khám phá bất kỳ nhật ký sự kiện nào chưa có mục nhập trong bảng Báo cáo. Các truy vấn tôi được sử dụng trong EF 4.2 là:
from el in _repository.EventLogs
where !_repository.Reports.Any(p => p.EventLogID == el.EventlogID)
Kể từ khi nâng cấp lên EF 5.0 tôi nhận được lỗi sau khi chạy:
System.NotSupportedException: Không thể để tạo ra một giá trị không đổi của gõ 'Namespace .Bài báo cáo'. Chỉ các loại nguyên thủy hoặc kiểu liệt kê mới được hỗ trợ trong ngữ cảnh này.
Tôi phát hiện ra rằng viết lại nó với cú pháp tham gia đã khắc phục sự cố. Các công trình sau đây trong EF 5.0 và là xấp xỉ tương đương:
from eventLog in _repository.EventLogs
join report in _repository.Reports on eventLog.EventlogID equals report.EventLogID into alreadyReported
where !alreadyReported.Any()
Một số người có thể có ý kiến trái chiều về cú pháp hỗn hợp/phong cách của truy vấn đầu tiên, nhưng tôi thực sự quan tâm nhiều hơn trong các lý do tại sao điều này. Có vẻ kỳ lạ khi trình biên dịch EF 4.2 có thể tạo ra câu lệnh SQL cho truy vấn ban đầu nhưng EF 5.0 từ chối. Đây có phải là một thiết lập mà tôi đang thiếu hoặc chỉ là một sự thắt chặt các ràng buộc giữa hai? Tại sao chuyện này đang xảy ra?
Cá nhân tôi nghĩ rằng nó dễ đọc hơn nhiều như một truy vấn với sự tham gia .. –
Bạn có thể kiểm tra điều này thay vì 'từ el trong _repository.EventLogs nơi _repository.Reports.All (p => p.EventLogID! = El.EventlogID) '? –
Hey King, tôi đã thử điều đó và nhận được điều tương tự. Tôi thậm chí đã cố gắng:! _repository.OntarioReports.Any (p => 5 == 5). Nó có vẻ là cú pháp hỗn hợp từ những gì tôi có thể nói. –