Начните снизу вверх, то есть примените фильтр к объекту PriceTier
и его родителям и включите его родителей (C # извините, но, надеюсь, вы поняли):
repository.PriceTiers
.Include("ChildProduct.Product") // eager load parents
.Where(priceTier =>
priceTier.IsActive &&
priceTier.ChildProduct.Display &&
priceTier.ChildProduct.Product.ID == 1 &&
priceTier.ChildProduct.Product.Display)
.AsEnumerable() // execute SQL statement
.Select(priceTier =>
priceTier.ChildProduct.Product) // return products rather than price tiers
(Примечание: priceTier =>
в C # совпадает с Function(priceTier)
в VB.NET)
MergeOption
в идеале должно быть установлено на что-то другое , чем NoTracking
при выполнении запроса. В противном случае EF не будет гарантировать, что объект, который появляется несколько раз в наборе результатов запроса, материализуется только один раз, например Product
или ChildProduct
:
Нежелательные результаты:
PriceTier 1 и 2 имеют одинаковых родителей, но родители материализуются несколько раз - один раз для каждого PriceTier.
Идеальные результаты:
Установите MergeOption
на любое значение, отличное от NoTracking
, чтобы получить следующие результаты: