Хотя вы можете получить нужные данные с некоторыми другими ответами, вы, вероятно, чрезмерно увлажняете (что означает, что вы слишком сильно попадаете в БД) для того, что вам нужно.
".Any
" это способ EF для написания предложений «WHERE EXISTS
».
Вот попытка запроса EF:
IEnumerable<Customer> justCustomersHydrated = db.Customer
.Where(p => p.Transactions.SelectMany(c => c.Purchases).Select(gc => gc.Product.Where(gc => gc.BKProduct == ProductInput).Any());
Я использую «p» как Parent, «c "как Child и" g c "как GrandChild. Вы, конечно, можете заменить их, но я пытаюсь показать намерение в коде.
Вы пытаетесь получить (сгенерированный) SQL, который выглядит примерно так.
select c.customerId /* and c.AllOtherColumns */
from dbo.customer customer
WHERE EXISTS
(
SELECT 1 FROM dbo.Transactions transaction
inner join dbo.Purchases purchases
on purchases.PurchaseId = transaction.PurchaseId
inner join dbo.Product product
on transaction.ProductId = product.ProductId
where tra.BKProduct = @ProductInput
AND /* relationship to outer query */
transaction.customerid = customer.customerid
)
Это приведет к гидратации объекта Customer (все скаляры и отсутствие свойств навигации объекта Customer).
По желанию вы можете выбрать (меньше скалярных свойств Customer) .... Вы также можете просто выбрать Customerid (хотя обычно выбор всех столбцов из родительской таблицы не так уж и ужасен, если только в этой таблице не много / много столбцов или где-то есть столбец с большими данными (image / varbinary (max)).
См. это ответ:
Entity Framework - проверьте, есть ли записи о внуках
Где в этом ответе есть "new {" для менее агрессивного SELECT.