Tại sao DbContext.Find của Entity Framework() tạo truy vấn với lựa chọn hàng đầu 2 và một bảng dẫn xuất? Theo định nghĩa, truy vấn được tìm kiếm bằng khóa chính cần phải là duy nhất.Tại sao DbContext.Find của Entity Framework() tạo truy vấn với lựa chọn hàng đầu 2?
Trả lời
Find
kiểm tra trước tiên nếu thực thể có khóa đã cho đã có trong ngữ cảnh. Nếu không, nó sẽ truy vấn cơ sở dữ liệu. Có thể nó sử dụng trong trường hợp này là truy vấn LINQ sử dụng SingleOrDefault
. SingleOrDefault
chuyển thành SELECT TOP 2
để có thể ném ngoại lệ nếu kết quả có nhiều hơn một thực thể.
Vì vậy, tại sao không Find
sử dụng FirstOrDefault
(có thể dịch thành SELECT TOP 1
). Tôi không biết, nhưng tôi đoán rằng Find
muốn kiểm tra xem thực thể có thực sự duy nhất trong cơ sở dữ liệu hay không. Nó nên - vì đó là khóa chính mà truy vấn sử dụng - nhưng mô hình và cơ sở dữ liệu có thể không đồng bộ vì ai đó đã thay đổi khóa chính trong cơ sở dữ liệu, ví dụ: thêm cột vào khóa tổng hợp trong cơ sở dữ liệu nhưng không có trong mô hình.
Thực sự chỉ là giả thuyết. Chỉ có nhóm phát triển EF mới có thể trả lời chính xác lý do.
Sửa
Nếu tôi làm điều này như mô tả ở trên (thêm cột để chìa khóa composite trong DB và thêm bản ghi có cùng giá trị trong cột then chốt đầu tiên) và gọi đó Find
, tôi nhận được ngoại lệ. ..
chuỗi chứa nhiều hơn một yếu tố
... và stacktrace này:
01.//...
System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source)
System.Data.Entity.Internal.Linq.InternalSet`1.FindInStore(
WrappedEntityKey key, String keyValuesParamName)
System.Data.Entity.Internal.Linq.InternalSet`1.Find(Object[] keyValues)
System.Data.Entity.DbSet`1.Find(Object[] keyValues)
Vì vậy, có vẻ như Find
thực sự sử dụng SingleOrDefault
.
Khi tôi chạy SingleOrDefault thông qua LinqPad và VS Tôi không bao giờ chọn SELECT TOP 2. Bạn nhận được từ đâu? Điều đó có phù hợp với EF không? –
@JamieRRytlewski: Đó là trường hợp của EF, vâng. Tôi không chắc là nó có độc quyền với EF không. Bạn đã kiểm tra cái gì? Với LINQ to SQL? – Slauma
Vâng tôi đã sử dụng LINQ to Sql .... vì vậy nó phải là một sự khác biệt. Tôi đã làm một số đọc và nó xuất hiện như thể nó chỉ hiển thị với EF. Nó có ý nghĩa để có TOP2, tôi chưa bao giờ thấy nó vì tôi không sử dụng EF. –
- 1. Entity Framework Truy vấn Tối ưu hóa
- 2. Khóa một bảng với một lựa chọn trong Entity Framework
- 3. Tại sao phương pháp mở rộng Single LINQ tạo truy vấn Chọn TOP (2)?
- 4. Tại sao TransactionScope không hoạt động với Entity Framework?
- 5. Entity Framework 5 loại dữ liệu sai trong truy vấn
- 6. C# Entity FrameWork MySQL Truy vấn chậm Đếm()
- 7. Tham số đầu ra với Entity Framework
- 8. Cách tốt nhất để viết truy vấn trong Entity Framework
- 9. Nơi bắt đầu với Entity Framework
- 10. Học thuyết 2 xóa với trình tạo truy vấn
- 11. Cách chọn một cột đơn với Entity Framework?
- 12. Entity Framework 4: Chọn Single Record
- 13. Nhận tổng số hàng trong Entity Framework
- 14. Tại sao LINQ-to-Entities đặt truy vấn này trong một lựa chọn phụ?
- 15. Làm cách nào để truy vấn cột số nguyên cho "bắt đầu bằng" trong Entity Framework?
- 16. SQLite với Entity Framework
- 17. Unicode với Entity Framework
- 18. Regex với trình tạo truy vấn Doctrine 2?
- 19. Lựa chọn chậm trong QTreeView, tại sao?
- 20. MySQL xóa với lựa chọn truy vấn lồng nhau
- 21. db2 truy vấn để chọn hàng đầu tiên lấy
- 22. Entity Framework tùy chọn: tùy chọn mối quan hệ
- 23. Tại sao màn trình diễn của 2 truy vấn này lại khác biệt?
- 24. Tạo báo cáo trong ASP.Net với Entity Framework
- 25. Phạm vi của AsNoTracking trong truy vấn LINQ trong Entity Framework
- 26. Truy vấn MySql: Chọn 3 hàng hàng đầu từ bảng cho mỗi danh mục
- 27. ASP.NET MVC với Entity Framework
- 28. jqGrid, cách điền danh sách lựa chọn từ truy vấn
- 29. Entity Framework Query Xml
- 30. Mã đăng ký thành viênUser và Entity Framework Đầu tiên
Tôi cảm thấy lo lắng về điều này hôm nay :) Rất vui khi bạn đã đăng bài này: P – RBT