2010-05-22 3 views
20

В чем разница между loadwith и associatewith. Из прочитанных статей кажется, что loadwith используется для загрузки дополнительных данных (например, всех заказов для клиентов). Хотя AssociateWith используется для фильтрации данных.linq to sql loadwith vs associatet

Это правильное понимание? Также будет хорошо, если кто-нибудь сможет объяснить это с помощью объяснения на основе примера.

ответ

30

LoadWith используются для выполнения нетерпеливых нагрузок из ассоциации, а не по умолчанию ленивой нагрузке в.

Обычно ассоциации загружаются при первом обращении к ним. Это означает, что если вы выберете 100 Order экземпляров, а затем сделайте что-нибудь с каждым из своих Details, вы фактически выполните операции 101 SELECT против базы данных. С другой стороны, если указывает LoadWith<Order>(o => o.Details), то все это делается в одном SELECT с добавленным JOIN.

AssociateWith не оказывает никакого влияния на когда ассоциация загружается, просто , что загружается. Он добавляет условие WHERE каждый раз, когда вы загружаете ассоциацию.

Как вы говорите, AssociateWith используется для автоматически данные фильтра. Как правило, вы должны использовать это, если знаете, что ассоциация имеет очень большое количество элементов, и вам нужно только определенное подмножество из них. Опять же, это в основном оптимизация производительности, совсем другое.

+6

Эта строка дала мне понять: «AssociateWith не влияет на загрузку ассоциации, просто на то, что загружено». Спасибо. – stackoverflowuser

7

Да, ваше понимание верное; AssociateWith фильтрует данные перед запросами, тогда как LoadWith возвращает связанные объекты в запросе. Причина использования LoadWith заключается в том, что вы можете возвращать связанные объекты в один единственный запрос. В противном случае вызовы дополнительных db будут выполняться в то время, когда вы перебираете связанные объекты.

Попробуйте сами и посмотрите на SQL, сгенерированный через Profiler или какой-либо другой регистратор. Помните, что эти параметры должны быть установлены в вашем DataContext перед выполнением любых запросов.

Ознакомьтесь с примерами в приведенных ниже ссылках (MSDN). Я только что скопировал примеры, которые они там используют.

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;