2009-01-24 30 views

Trả lời

9

Sử dụng ObjectContext#GetObjectByKey() để truy xuất các đối tượng theo khóa thay vì sử dụng toán tử First() (hoặc FirstOrDefault) trong truy vấn LINQ. Sau này sẽ truy cập cơ sở dữ liệu mọi lúc trong khi trước đây sẽ tìm kiếm bộ nhớ cache EF (ObjectStateManager để cụ thể) cho thực thể trước và sẽ không nhấn vào cơ sở dữ liệu nếu thực thể có khóa được chỉ định được tìm thấy.

Tài liệu tham khảo

4

Giả sử chúng ta có BlogPost thực thể tham chiếu User thực thể thông qua Author tài sản. Thay vì chỉ định một thực thể đầy đủ User đến thuộc tính BlogPost.Author (có thể yêu cầu một vòng lặp cơ sở dữ liệu), hãy khởi tạo tham chiếu bằng đúng EntityKey. Ví dụ:

BlogPost.AuthorReference.EntityKey = new EntityKey("EFNamespace.User", "Id", userId); 
1

Cách nhanh chóng và dễ dàng để cập nhật các đối tượng thực thể tách rời. Đó là một phương pháp mở rộng.

public static void AttachUpdated(this ObjectContext obj, EntityObject objectDetached) 
{ 
    if (objectDetached.EntityState == EntityState.Detached) 
    { 
     object original; 
     if (obj.TryGetObjectByKey(objectDetached.EntityKey, out original)) 
      obj.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached); 
     else 
      throw new ObjectNotFoundException(); 
    } 
} 
8

Một điều tôi vừa học được khi profiling SQLs tạo ra bởi mã EF được sử dụng trong ứng dụng của tôi: có một sự khác biệt giữa:

IEnumerable<User> users = DB.User.Where(...); 
int count = users.Count(); 

IQueryable<User> users = DB.User.Where(...); 
int count = users.Count(); 

Cựu tạo truy vấn đầy đủ để truy xuất các hàng phù hợp từ bảng User và việc đếm được thực hiện sau khi dữ liệu đã được chuyển trở lại EF. Cái sau thực hiện những gì thường được mong đợi: tạo ra một câu lệnh SQL SELECT COUNT ..., hiệu quả hơn nhiều.

Điều này khá tinh tế nhưng không khó để tìm ra lý do tại sao sau khi nhận thấy về nó: đó là do tính chất ràng buộc tĩnh của phương pháp mở rộng C#.

Một kỹ thuật nhỏ để làm được việc này là sử dụng "var" từ khóa để khai báo biến:

var users = DB.users.Where(...); 
int count = users.Count(); 

Điều này sẽ gây ra "người sử dụng" để được khai báo là cùng loại rằng ".Where" lợi nhuận ; là một IQueryable <>.

+0

Đây là một ví dụ tốt về lý do tại sao chúng tôi nên sử dụng đề xuất 'var' trên loại biến cụ thể. – Rafid

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