Похоже, что вы хотите запросить и вернуть сущность, ее родителя, а затем подмножество его дочерних элементов.Вы можете использовать EF для запроса этого, но только уменьшив ваш запрос до желаемой структуры.Если вы возвращаете Report_Asset, он может достаточно легко включить ссылку на своего родителя, но он всегда будет ссылаться на свой полный набор дочерних элементов, EF не фильтрует дочерние наборы на уровне сущности.
Лучше всего взглянуть накакие поля вы хотите получить от каждой сущности, и выберите структуру, содержащую только эти поля, но на самом базовом уровне это должно дать вам то, что вы хотите:
var model = ctx.Report_Asset
.Select( x = > new
{
Report_Asset = x,
Site_Report = x.Site_Report,
Handled_By = x.Site_Report.Handled_By,
Published_By = x.Site_Report.Published_By,
Asset_Calcerts = x.Assert_Calcerts.Where(c => c.asset_calcert_id == assetCalcertId).ToList()
}).FirstOrDefault();
Проверка calcert выглядит как поиск определенногоодин сертификат, так что это может быть лучше:
var model = ctx.Report_Asset
.Select( x = > new
{
Report_Asset = x,
Site_Report = x.Site_Report,
Handled_By = x.Site_Report.Handled_By,
Published_By = x.Site_Report.Published_By,
Asset_Calcert = x.Assert_Calcerts.SingleOrDefailt(c => c.asset_calcert_id == assetCalcertId)
}).FirstOrDefault();
Если вы хотели загружать только активы отчета, которые имели соответствующий Calcert, с родительским элементом и соответствующим calcert:
var model = ctx.Report_Asset
.Where(x => x.Asset_Calcerts.Any(c => c.asset_calcert_id == assetCalcertId))
.Select( x = > new
{
Report_Asset = x,
Site_Report = x.Site_Report,
Handled_By = x.Site_Report.Handled_By,
Published_By = x.Site_Report.Published_By,
Asset_Calcert = x.Asset_Calcerts.SingleOrDefailt(c => c.asset_calcert_id == assetCalcertId)
}).FirstOrDefault();
Во всех случаях я бы рекомендовал добавить предложение OrderBy
перед FirstOrDefault
, чтобы обеспечить использование предсказуемого порядка.
Предостережение в этом подходе заключается в том, что если вы обращаетесь к объектам возвращенной модели и начинаете детализациюпросматривая их ссылки, вы все равно будете вызывать ленивую загрузку из базы данных.Например, если я использую:
model.Report_Asset.Asset_Calcerts
, например, это все равно будет лениво загружать связанные сущности для этого актива отчета, и перечислять все калькуляторы для этого актива,Отфильтрованный набор / совпадение загружен в модель. Asset_Calcert (s), а не возвращенная сущность Model_Asset.
Как правило, вам лучше использовать Select
, чтобы просто получить нужные вам свойства из различныхобъекты, а не пытаться выбрать целые объекты или графы объектов.Это исключает необходимость использования Include
, просто скажите EF, что именно вы хотите от графа сущностей, и он создаст оператор SQL для эффективного извлечения только этой информации.