【发布时间】:2020-07-23 20:43:59
【问题描述】:
首先,请允许我道歉,我对 EF 还很陌生,并且继承了一堆我几乎看不懂的代码。所以这可能不是最好的措辞问题......但它就是这样。
我将 Dotnet Core 与 EF 结合使用,并为每个类进行了以下设置。
笔记表:
public int NoteId { get; set;}
public string Description { get; set; }
public List<NoteDetails> NoteDetails {get; set; }
注意事项
public string Description { get; set; }
public int NoteDetailId { get; set; }
public int NoteId { get; set; }
public MetaDataOptions Frequency { get; set; }
public int? FrequencyId { get; set; }
public MetaDataOptions Width { get; set; }
public int? WidthId { get; set; }
public MetaDataOptions Length { get; set; }
public int? LengthId { get; set; }
元数据选项:
public int MetaDataId { get; set; }
public string Description { get; set; }
public int? DisplayOrder { get; set; }
public bool IsActive { get; set; }
在我看代码的地方,NoteDetailsTable 的数据已填写完毕,FrequencyId、WeightId 和 LengthID 均填写了它们的透视 ID,参考 MetaDataOptions 表。
然后代码会执行一些 EF Magic:
_clinicalSummaryDbContext.NoteDetails.Select(a => a.Frequency).Load();
_clinicalSummaryDbContext.NoteDetails.Select(a => a.Width).Load();
_clinicalSummaryDbContext.NoteDetails.Select(a => a.Height).Load();
响应对象看起来像:
{
"NoteID":1,
"Description":"First Note",
"NoteDetails":[
{
"NoteId":1,
"FrequencyId":1,
"Frequency":{
"RefTableId":1,
"description":"Frequency Desciption"
},
"WidthId":2,
"Width":{
"RefTableId":2,
"description":"Width Description"
},
"HeightID":3,
"Height":{
"RefTableId":3,
"description":"Height Description"
}
}
]
}
这正是我想要的。然而,问题是我们的性能团队注意到 3 个加载事件 (.Select(a => a.Frequency).Load();...) 正在拉下整个 noteetails 表。不仅仅是与笔记相关的记录。当我在 SQL 上放置一个分析器时,我可以看到它运行以下语句,每个引用一次
SELECT [w].[WoundDetailId] ...
FROM [NoteDetail] AS [w]
LEFT JOIN [MetaDataOptions] AS [w.Frequency] ON [w].[FrequencyId] = [w.Frequency].[MetaDataOptionId]
我的问题是,我能否转换该加载语句,使其仅加载每个引用的单个 MetaDataOptions 记录,并以与上述相同的方式将其附加到响应对象。
我希望我解释得足够好。很高兴提供任何有帮助的其他信息。
【问题讨论】:
标签: sql .net entity-framework