Линк к sql нагрузке с ассоциированным с - PullRequest
22 голосов
/ 22 мая 2010

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

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

Ответы [ 2 ]

34 голосов
/ 22 мая 2010

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

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

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

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

9 голосов
/ 22 мая 2010

Да, ваше понимание верно; 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...