2009-03-13 34 views
12

Tôi muốn tìm nạp dữ liệu với tải mong muốn bằng cách sử dụng Linq2SQL. Mã này tương tự như:Linq2SQl mong muốn tải với nhiều DataLoadOptions

 DataLoadOptions options = new DataLoadOptions(); 

     options.LoadWith<Product>(c => c.ProductCompanies); 

     options.LoadWith<Product>(c => c.OrderDetails); 

     db.LoadOptions = options; 

     IEnumerable<Product> products = db.Products.ToList<Product>(); 

Tôi kiểm tra nó đã tạo nhiều hơn 1 truy vấn SQL như tôi mong đợi. Trên thực tế nó chỉ làm háo hức tải với sản phẩm và OrderDetails, và ProductCompany được truy vấn từng người một. Tôi có làm gì sai ở đây không? Hoặc nó là một vấn đề Linq2SQL? Chúng ta có cách giải quyết nào không?

Cảm ơn rất nhiều!

Cập nhật: Tôi kiểm tra sql từ SQL Profiler. Tôi thấy cả Leppie và Ian đều đúng. Chúng được giới hạn trong một giao dịch. Nhưng khi tôi đặt nó là tải lười, nó đã mở nhiều kết nối.

+1

Hãy cẩn thận , DataLoadOptions tạo ra một số truy vấn rất không hiệu quả. –

+0

Cảm ơn, Chad! Tôi sẽ trở lại Nhibernate trong dự án tiếp theo của tôi: =) –

Trả lời

3

Không, bạn đã không làm bất cứ điều gì sai, Linq2SQL lô tất cả mọi thứ trong một giao dịch duy nhất, nhưng có thể thực hiện một số truy vấn không có kết quả cho kết quả yêu cầu. DataLoadOptions thường chỉ được sử dụng khi DataContext không khả dụng cho toàn bộ ngữ cảnh sử dụng kết quả. Nếu bạn có thể giữ cho số DataContext còn sống trong khi thực thi, tốt nhất là dựa vào việc thực hiện trì hoãn (đó là mặc định).

+0

Cảm ơn, leppie! Tôi kiểm tra SQL Profile, các sqls là trong một giao dịch. –

2

Theo các tài liệu:

Khi bạn truy vấn cho một đối tượng, bạn thực sự lấy chỉ đối tượng mà bạn yêu cầu. Các đối tượng liên quan không tự động được tìm nạp cùng một lúc.

Lớp DataLoadOptions cung cấp hai phương pháp để tải ngay lập tức dữ liệu liên quan được chỉ định. Phương thức LoadWith cho phép tải dữ liệu ngay lập tức liên quan đến mục tiêu chính. Phương thức AssociateWith cho phép lọc các đối tượng liên quan.

Có nhiều câu lệnh sql không làm tôi ngạc nhiên. Tôi nghĩ sự khác biệt ở đây là tất cả các câu lệnh chỉ được tải lên phía trước thay vì tải chúng theo yêu cầu.

+0

Cảm ơn, Ian! Tôi nghĩ bạn đúng. –

+2

Điều đáng ngạc nhiên là 'LoadWith ' * không * đảm bảo tải mong muốn: -/ –

16

Tôi cũng gặp vấn đề này trong một số mã, và sau nhiều thử nghiệm và googling nó giống như LINQ chỉ có thể tham gia trên một mối quan hệ một-nhiều từ mỗi bảng: nếu bạn cố gắng xác định nhiều hơn một nạp nó chỉ (ngẫu nhiên?) chọn cái nào để pre-load và mà những người khác rời chậm (chỉ đơn giản là bỏ qua những gợi ý LoadWith)

những người khác đã đăng tải này quá, ví dụ

http://codebetter.com/blogs/david.hayden/archive/2007/08/06/linq-to-sql-query-tuning-appears-to-break-down-in-more-advanced-scenarios.aspx

+2

Liên kết đẹp. Và tốt hơn nữa, câu trả lời này thực sự trả lời câu hỏi - * "TẠI SAO TÀI LIỆU KHẢO SÁT VÀ/HOẶC MISLEADING" *? 'LoadWith ' có thể rất dễ dàng * âm thầm thất bại * hoặc * làm điều riêng của nó * và gây ra các vấn đề khi truy cập các mục bên ngoài một vòng đời DataContext. Tôi thậm chí không quan tâm về hiệu quả - tôi chỉ muốn làm việc ngữ nghĩa. Cách đáng tin cậy duy nhất mà tôi đã tìm thấy để giải quyết hiệu quả vấn đề này là truy cập * force * theo cách thủ công trong phạm vi DataContext. –

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