2013-08-16 41 views
5

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>> ...

+1

Hrm. Đó là tò mò. Điều gì về đâu (i => i.IsDeleted == false)? – Tim

+0

@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

+2

@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

Trả lời

0

T vấn đề là ngay sau khi bạn sử dụng IEnumerable truy vấn sẽ được thực hiện và tất cả các truy vấn sau đây sẽ xảy ra như LINQ đối với các truy vấn đối tượng.

Sai lầm của tôi mà hãy để cho câu hỏi này là tôi đã thử nghiệm các truy vấn theo cách sau:

IEnumerable<Image> items = db.Images.Where(i => i.IsDeleted.Equals(false)); 

IEnumerable<Image> items = db.Images; 
images = images.Where(i => !i.IsDeleted); 

Vì vậy, trong trường hợp đầu tiên các Where vẫn thực hiện chống lại một IQueryable, nhưng trong trường hợp thứ hai so với số IEnumerable.

Sau đó, tôi gặp phải sự cố với OrderByIQueryable bạn cần thông số Expression<Func<T, K>> và tôi đã sử dụng Expression<Func<T, IComperable>>, nhưng ví dụ: Func<T, int> không thể được đúc thành Func<T, IComperable> theo Entity Framework.
Để xem chi tiết cách khắc phục sự cố này, hãy xem câu hỏi khác của tôi HERE