2013-06-06 32 views
21

Có sự khác biệt đáng kể giữa .Find(id).Where(x = >x.Id == id) nên bắt buộc tôi sử dụng .Find() trên .Where()/.First()?Khuôn khổ thực thể Tìm so với vị trí

Tôi sẽ tưởng tượng rằng .Find() sẽ hiệu quả hơn nhưng hiệu quả hơn tôi nên tránh .Where()/.First()?

Lý do tôi hỏi là tôi đang sử dụng FakeDbSet chung trong các thử nghiệm để dễ dàng thực hiện kết quả giả và cho đến nay tôi thấy rằng tôi phải kế thừa lớp đó và cung cấp triển khai tùy chỉnh .Find() trong khi nếu tôi viết mã của tôi với .Where()/.First() Tôi không cần phải làm thêm công việc đó.

+1

Tốt hơn là bạn nên so sánh 'Find' và' SingleOrDefault', vì 'Where' trả về bộ sưu tập. –

+0

Đúng, mặc dù tôi luôn sử dụng .First hoặc .FirstOrDefault. –

+3

@JimmyBosse bạn có thể muốn xem xét việc sử dụng Single, cho bất kỳ tình huống nào chỉ có 1 bản ghi phù hợp. – Kyle

Trả lời

31

Điểm là find bắt đầu bằng cách tìm kiếm trong bộ nhớ cache cục bộ của ngữ cảnh và sau đó, nếu không khớp, gửi truy vấn đến db.

where luôn gửi truy vấn đến db.

Với EF 4. *, tôi từng nghĩ rằng sql được tạo bởi find quá phức tạp và trong một số trường hợp, dẫn đến sự cố hiệu suất. Vì vậy, tôi luôn sử dụng where ngay cả với EF 5. Tôi nên kiểm tra sql được tạo bởi find với EF 5.

Vì vậy, trong bài báo, find là tốt hơn vì anh ấy sử dụng bộ nhớ cache.

+9

+1. Tìm cũng không có chi phí truy cập một cây biểu thức, vì vậy nó có thể nhấn cơ sở dữ liệu nhanh hơn, nếu nó nhấn cơ sở dữ liệu. Luôn luôn đi qua một 'ExpressionVisitor'. – vcsjones

+0

Tôi có thể không nhận được dữ liệu không chính xác do bộ nhớ cache không? Tức là Db được cập nhật trong nền? – Zapnologica

+0

Có, bạn có thể. Bạn cũng có thể có vấn đề đồng thời acces về việc cập nhật một bản ghi sau khi retreiving nó, hoặc do mức cô lập hoặc ... :) – tschmit007

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