2010-03-09 49 views
5

Tôi đang gặp sự cố khi cố gắng thực hiện truy vấn LINQ to SQL và ánh xạ tới đối tượng miền DRY mà không phải chịu chi phí của nhiều chuyến đi vòng đến db. Đưa ra ví dụ này:LINQ to SQLQL đối tượng ánh xạ đối tượng miền và hiệu suất

var query1 = from x in db.DBProducts 
      select new MyProduct 
      { 
       Id = x.ProductId, 
       Name = x.ProductName, 
       Details = new MyProductDetail 
       { 
        Id = x.DBProductDetail.ProductDetailId, 
        Description = x.DBProductDetail.ProductDetailDescription 
       } 
      } 

Truy vấn sẽ thực hiện MỘT chuyến đi khứ hồi tới DB. Tuyệt quá! Tuy nhiên, vấn đề tôi thấy với điều này là cuối cùng, tôi cũng sẽ có một phương pháp 'GetProductDetails' mà cũng sẽ cần phải thực hiện một số đối tượng "đối tượng dữ liệu - đối tượng tên miền" ánh xạ, rất giống với ở trên.

Để giảm bớt một số bản đồ, tôi nghĩ rằng nó có thể là một ý tưởng tuyệt vời để mở rộng các lớp đối tượng dữ liệu cục bộ để làm bản đồ cho tôi, như vậy:

public partial class DBProduct 
{ 
    MyProduct ToDomainObject() 
    { 
     return new MyProduct 
     { 
      Id = this.ProductId, 
      Name = this.ProductName, 
      Details = this.DBProductDetails.ToDomainObject() 
     }; 
    } 
} 

public partial class DBProductDetail 
{ 
    MyProductDetail ToDomainObject() 
    { 
     return new MyProductDetail 
     { 
      Id = this.ProductDetailId, 
      Description = this.ProductDetailDescription 
     }; 
    } 
} 

Nice! Bây giờ, tôi có thể chỉ cần viết lại truy vấn1 như sau:

var query1 = from x in db.DBProducts 
      select x.ToDomainObject(); 

Điều này làm cho mã càng khô và dễ đọc hơn. Ngoài ra, các truy vấn khác cần thực hiện cùng một kiểu ánh xạ có thể chỉ cần sử dụng phương thức ToDomainObject() để ánh xạ. Nó hoạt động, nhưng với một chi phí. Trong khi xem qua Profiler, truy vấn đầu tiên sẽ gọi db ONCE, nối các bảng khi cần thiết. Truy vấn thứ hai không tham gia một cách thích hợp, do đó thực hiện nhiều cuộc gọi đến DB. Có cách nào để thực hiện những gì tôi đang cố gắng làm: refactor LINQ to SQL truy vấn để ánh xạ tới các đối tượng miền là DRY (không sao chép mã)?

+0

Dòng này có vẻ sai ... Chi tiết = this.ToDomainObject() - Tôi không nghĩ bạn muốn gọi ToDomainObject() đệ quy! Có lẽ bạn có nghĩa là Details = this.DBProductDetail.ToDomainObject()? –

+0

Ồ, bắt thú vị! Tôi đã cập nhật bài đăng gốc để phản ánh điều đó. Vẫn không giải quyết được vấn đề của tôi mặc dù .. :( – tbehunin

+3

+1 Đó là tội phạm mà câu hỏi thú vị này đã không tạo ra nhiều cuộc thảo luận hơn – fearofawhackplanet

Trả lời

1

Sử dụng AutoMapper. Khi bạn đã thử, có thể bạn sẽ không bao giờ thấy mã như sau:

new MyProduct 
{ 
    Id = x.ProductId, 
    Name = x.ProductName, 
    Details = new MyProductDetail 
    { 
     Id = x.DBProductDetail.ProductDetailId, 
     Description = x.DBProductDetail.ProductDetailDescription 
    } 
} 
Các vấn đề liên quan