2010-09-05 26 views
5

Tôi đang cố gắng để giải quyết một vấn đề tương tự như mô tả ở đâyTránh đang chiếu lặp lại trong Entity Framework

Initializing strongly typed objects in LINQ to Entities

chỉ từ hoàn toàn theo hướng ngược lại. Tôi có một số chức năng trong kho lưu trữ của mình, tất cả đều trả về dữ liệu có hình dạng giống hệt nhau. Vấn đề là mã chiếu của tôi:

select new pocoClass 
{ 
    // complex projection that is several pages long includes grabbing a graph of data 
} 

tại thời điểm nó tồn tại cho mỗi truy vấn trong kho lưu trữ. Tôi đã thử di chuyển nó vào một bộ khởi tạo đối tượng, nhưng điều đó mang lại cho tôi sự sợ hãi "Chỉ các nhà xây dựng không có tham số và khởi tạo được hỗ trợ trong LINQ to Entities." vấn đề.

tôi đã cố gắng tách thành hai truy vấn

var candidates = (from thing in _entities.whatever 
    where (complex.stuff==true) 
    select thing); 

var final = (from thing in candidates.AsEnumerable() 
    let x = thing.ITEMS.Where(blah=>blah.blah==param) 
    let y = x.OTHERITEMS.FirstOrDefault() 
    select new pocoClass(thing,x,y); 

nhưng ở đây cuối cùng luôn luôn là null và mã trong pocoClass mới không bao giờ được gọi. Tôi đã bao gồm let x & y ở trên vì chúng luôn thay đổi giữa mỗi lần sử dụng phép chiếu.

Vì vậy, tôi có phải quay lại nhiều bản sao của bản chiếu của mình hoặc có cách nào khác không?

Trả lời

12

Tôi không chắc nó có ích cho bạn hay không, nhưng điều tôi thường làm là tạo các phương pháp chiếu mất IQueryable và trả về IQueryable để dịch từ đối tượng miền sang DTO. Chúng trông giống như thế này:

public static IQueryable<CustomerDTO> ToCustomerDTO(
    IQueryable<Customer> customers) 
{ 
    return 
     from customer in customers 
     select new CustomerDTO() 
     { 
      ... 
     }; 
} 

Điều này cho phép tôi có phép chiếu này ở một nơi duy nhất. Từ một vài nơi trong lớp kinh doanh của tôi, tôi gọi một phương thức như vậy.

Có một vài điều cần lưu ý, mặc dù:

  • Hãy chắc chắn rằng những phương pháp chiếu không chứa bất kỳ logic kinh doanh. Có bất kỳ bộ lọc cụ thể sử dụng trường hợp nào sẽ là xấu.
  • Thỉnh thoảng bạn có DTO chứa biểu đồ đối tượng phức tạp mà bạn muốn kéo từ cơ sở dữ liệu vào một truy vấn đơn. Với một chút sáng tạo, điều này rất thường xuyên có thể, nhưng không phải khi trả lại một số IQueryable. Trong trường hợp đó tôi trả về một loạt các DTO.
  • Tôi đặt các phương pháp chiếu đó dưới dạng phương thức tĩnh bên trong lớp DTO. Trong khi đây không phải là một thiết kế rất sạch sẽ, nó phát hiện ra nó làm cho mã rất dễ bảo trì.

Tôi hy vọng điều này sẽ hữu ích.

+0

Hầu hết - vấn đề logic kinh doanh - trong ví dụ của tôi các câu lệnh được đánh giá cho từng khách hàng trước khi chiếu. – Andiih

+0

Thực tế là đủ để cho tôi một giải pháp. Tôi đã tạo một lớp trung gian DTO được đơn giản hóa mới mà tôi có thể dự án tại chỗ chỉ bằng cách sao chép một nửa tá giá trị: mỗi giá trị là một thực thể EF toàn bộ. Sau đó, tôi sử dụng giải pháp của bạn để thực hiện phép chiếu cuối cùng từ các thực thể đó. Bạn không chắc chắn nó sẽ hoạt động như thế nào, nhưng chắc chắn nó là một trò chơi! – Andiih

+0

@Andiih: Bạn sẽ phải sử dụng trình lược tả SQL để xem có bao nhiêu truy vấn được thực hiện trong nền. Có một sự thay đổi tốt mà EF sẽ thực thi nhiều truy vấn phía sau bìa. Khóa học của công nghệ- có giới hạn của nó. Nếu bạn không hài lòng với hiệu suất và không có đầu mối về cách để có được điều này trong một truy vấn duy nhất, có lẽ tôi có thể giúp bạn với điều đó. Trong trường hợp đó, hãy bắt đầu một câu hỏi mới tại đây tại SO và thả một liên kết đến nó tại đây.Chúc mừng – Steven

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