Подтвердить что ты не робот

Linq to sql loadwith vs associatewith

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Попробуйте разные примеры самостоятельно и посмотрите на 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;