Tôi đang sử dụng ASP.NET MVC 4 và Entity Framework 6 (Mã Đầu tiên) và có một số hành vi lạ mà tôi không muốn/thích:
Tôi có một lớp thực thể Images
có thuộc tính boolean IsDeleted
và bây giờ tôi muốn có 25 hình ảnh đầu tiên không bị xóa, vì vậy tôi đã sử dụng như sau mã:.Where (i =>! I.IsDeleted) không dịch sang SQL nhưng .Where (i => i.IsDeleted.Equals (false))
IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25);
Vì đây là rất chậm tôi điều tra sâu hơn một chút và phát hiện ra, rằng Where(i => !i.IsDeleted)
đã gây nên các truy vấn DB và tất cả các hình ảnh được nạp (và phân tích cú pháp => chậm) và kiểm tra sau đó sẽ xảy ra "trong mã ". Sau đó, tôi đã thử Where(i => i.IsDeleted.Equals(false))
hoạt động tốt và kiểm tra gặp phải qua SQL.
Tại sao tôi làm như vậy hoặc làm cách nào để tránh sự cố này, vì tôi thích cú pháp đầu tiên tốt hơn nhiều?
Đây có phải là lỗi uf EF 6 beta hay điều này xảy ra trong các phiên bản EF không?
UPDATE:
Vấn đề là các diễn viên để IEnumerable<Image>
(tôi đã làm Where
không trong cùng một dòng trong mã của tôi, nhưng thay đổi nó ở đây vì đơn giản), nhưng tôi đang sử dụng này cũng làm một .OrderBy(...).ThenBy(...)
sử dụng Func<T, TKey>
-keys và mà không trở IOrderedEnumerable
và không IOrderedQueryable
...
UPDATE 2: giải quyết bằng cách sử dụng phím Expression<Func<T, TKey>>
...
Hrm. Đó là tò mò. Điều gì về đâu (i => i.IsDeleted == false)? – Tim
@Tim: Giống như '! I.IsDeleted', nhưng tôi nghĩ rằng nó có thể là ẩn của tôi để' IEnumerable 'và không phải là' Where' (tôi đã làm 'Equals'" inline ", nhưng'! '" trong dòng tiếp theo ") - Tôi đang điều tra ... –
ChrFin
@chrfin OK, vì vậy đây là lý do. Bạn sẽ lấy tất cả các mục từ cơ sở dữ liệu vào bộ nhớ khi bạn thực hiện 'IEnumerable items = db.Images;' Sử dụng 'IQueryable' để tạo truy vấn trong vài dòng và không thực hiện truy vấn cho đến khi bạn thực sự muốn nó. –
MarcinJuraszek