Linq to sql loadwith vs associatewith
какая разница между loadwith и associatewith. Из прочитанных статей кажется, что loadwith используется для загрузки дополнительных данных (например, всех заказов для клиентов). Хотя AssociateWith используется для фильтрации данных.
Это правильное понимание? Также будет хорошо, если кто-нибудь сможет объяснить это с помощью объяснения на основе примера.
Ответы
Ответ 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;