2010-05-22 35 views
20

sự khác nhau giữa loadwith và associwith là gì. Từ các bài viết tôi đọc có vẻ như loadwith được sử dụng để tải dữ liệu bổ sung (ví dụ: tất cả các đơn đặt hàng cho khách hàng). Trong khi AssociateWith được sử dụng để lọc dữ liệu.LINQ to sql loadwith vs associatewith

Đó có phải là sự hiểu biết chính xác không? Ngoài ra nó sẽ được tốt đẹp nếu ai đó có thể giải thích điều này với một ví dụ dựa trên lời giải thích.

Trả lời

30

LoadWith được sử dụng để thực hiện một háo hức tải của một hiệp hội như trái ngược với mặc định lười biếng tải.

Thông thường, các liên kết được tải lần đầu tiên bạn tham chiếu chúng. Điều đó có nghĩa là nếu bạn chọn 100 trường hợp Order và sau đó thực hiện điều gì đó với từng số Details, bạn thực sự đang thực hiện các hoạt động 101 SELECT đối với cơ sở dữ liệu. Mặt khác, nếu LoadOptions chỉ định LoadWith<Order>(o => o.Details), thì tất cả được thực hiện trong một SELECT đơn lẻ với số JOIN được thêm vào.

AssociateWith không có bất kỳ ảnh hưởng khi hiệp hội được nạp, chỉ được tải. Nó thêm mệnh đề WHERE mỗi khi bạn tải một liên kết.

Như bạn nói, AssociateWith được sử dụng để tự động dữ liệu lọc. Thông thường bạn sẽ sử dụng điều này nếu bạn biết rằng một hiệp hội có một số lượng rất lớn các yếu tố và bạn chỉ cần một tập hợp con cụ thể của chúng. Một lần nữa, nó chủ yếu là một tối ưu hóa hiệu suất, chỉ là một loại khác nhau.

+6

Dòng này làm rõ ràng cho tôi "AssociateWith không có bất kỳ ảnh hưởng nào khi liên kết được tải, chỉ những gì được tải". Cảm ơn. – stackoverflowuser

7

Có hiểu biết của bạn là chính xác; AssociateWith lọc dữ liệu trước khi truy vấn trong khi LoadWith trả về các đối tượng liên quan trong truy vấn. Lý do để thực hiện LoadWith là vì vậy bạn có thể trả về các đối tượng liên kết trong một truy vấn đơn lẻ. Nếu không, các cuộc gọi db bổ sung sẽ được thực hiện tại thời điểm bạn lặp lại các đối tượng liên quan của mình.

Hãy thử các ví dụ khác cho mình và xem qua SQL được tạo thông qua Profiler hoặc một số trình ghi nhật ký khác. Hãy nhớ rằng các tùy chọn này cần phải được đặt trên DataContext của bạn trước khi bạn thực hiện bất kỳ truy vấn nào.

Hãy xem các ví dụ trong các liên kết dưới đây (MSDN). Tôi vừa sao chép các ví dụ mà họ sử dụng ở đó.

LoadWith

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Customer>(c => c.Orders); 
db.LoadOptions = dlo; 

var londonCustomers = from cust in db.Customers 
         where cust.City == "London" 
         select cust; 

AssociateWith

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.AssociateWith<Customer>(
    c => c.Orders.Where(p => p.ShippedDate != DateTime.Today)); 
db.LoadOptions = dlo; 

var custOrderQuery = from cust in db.Customers 
        where cust.City == "London" 
        select cust;