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?
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
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
@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