Tôi đã sử dụng Khuôn khổ thực thể với phương pháp tiếp cận POCO đầu tiên. Tôi đã theo dõi rất nhiều mô hình của Steve Sanderson trong cuốn sách 'Pro ASP.NET MVC 3 Framework' của mình, sử dụng một thùng chứa DI và lớp DbContext để kết nối với SQL Server.Cải thiện hiệu quả với Khung thực thể
Các bảng bên dưới trong máy chủ SQL chứa các bộ dữ liệu rất lớn được sử dụng bởi các ứng dụng khác nhau. Bởi vì điều này tôi đã phải tạo chế độ xem cho các thực thể tôi cần trong đơn đăng ký của mình:
class RemoteServerContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Contact> Contacts { get; set; }
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>().ToTable("vw_Customers");
modelBuilder.Entity<Order>().ToTable("vw_Orders");
...
}
}
và điều này có vẻ phù hợp với hầu hết nhu cầu của tôi.
Vấn đề là tôi có một số những quan điểm có rất nhiều dữ liệu trong đó để khi tôi gọi cái gì đó như:
var customers = _repository.Customers().Where(c => c.Location == location).Where(...);
nó dường như mang lại toàn bộ tập dữ liệu, mà có thể mất một thời gian trước khi truy vấn LINQ giảm tập hợp cho những người mà tôi cần. Điều này có vẻ rất không hiệu quả khi các tiêu chí chỉ áp dụng cho một vài bản ghi và tôi nhận được toàn bộ dữ liệu được đặt trở lại từ máy chủ SQL.
Tôi đã cố gắng để làm việc này bằng cách sử dụng thủ tục lưu trữ, chẳng hạn như
public IEnumerable<Customer> CustomersThatMatchACriteria(string criteria1, string criteria2, ...) //or an object passed in!
{
return Database.SqlQuery<Customer>("Exec pp_GetCustomersForCriteria @crit1 = {0}, @crit2 = {1}...", criteria1, criteria2,...);
}
trong khi đây là nhanh hơn nhiều, vấn đề ở đây là nó không trả lại một DbSet và vì vậy tôi mất tất cả các kết nối giữa các đối tượng của tôi, ví dụ Tôi không thể tham chiếu bất kỳ đối tượng liên quan nào như đơn đặt hàng hoặc liên hệ ngay cả khi tôi bao gồm ID của họ vì loại trả về là tập hợp 'Khách hàng' thay vì DbSet của chúng.
Có ai có cách nào tốt hơn để nhận máy chủ SQL để thực hiện truy vấn sao cho tôi không chuyển tải các dữ liệu không được sử dụng xung quanh?
+1. Để biết thêm về 'cách tiếp cận mở rộng', bạn có thể viết một hàm lấy một vị từ và trả về '_repository.Customers() .Địa điểm (vị ngữ)' hoặc (nếu nó không phải là IQueryable nữa) hãy viết một hàm riêng biệt với 'context.CreateQuery ("Khách hàng") Ở đâu (vị ngữ) ', với khả năng gọi' .ToList() 'ở cuối. Nó sẽ xây dựng một biểu thức đẹp, được tối ưu hóa. –
Xin chào. Bạn đã tìm được đề xuất của mình để ở lại trong lĩnh vực IQueryable. Tôi đã sử dụng một IEnumerable mà không vượt qua các truy vấn đến máy chủ nhưng được tất cả các hồ sơ và sau đó lọc chúng. Xem bài viết ở đây: http://www.fascinatedwithsoftware.com/blog/post/2011/06/27/IEnumerable-IQueryable-and-the-Entity-Framework-40.aspx Tôi đã kiểm tra với SQL Profiler và anh ấy đúng, IQueryable chuyển các tham số vào như một truy vấn – GrahamJRoy