简化 EF Core 中单个子属性的 DTO 映射
Entity Framework Core (EF Core) 使用表达式树简化了对象到 DTO(数据传输对象)的转换。 这对于子集合很有效,但映射单个子属性可能不太直观。 本文探讨了重用代码并有效处理此场景的解决方案。
挑战:独生子女财产映射
直接将单个子属性映射到 DTO 通常需要手动添加表达式,从而导致代码重复。 考虑这个例子:
<code class="language-csharp">public static Expression<Func<Model, ModelDto>> AsDto => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = new AnotherChildModelDto // Manual mapping here { AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId } };</code>
解决方案:利用外部库
一些库通过为单个实体有效添加类似于 .Select()
的功能来提供优雅的解决方案,从而实现代码重用:
1。 LINQKit:
LINQKit 允许扩展表达式,动态处理单子映射。
<code class="language-csharp">[Expandable(nameof(AsDtoImpl))] public static ModelDto AsDto(Model model) { _asDtoImpl ??= AsDtoImpl().Compile(); return _asDtoImpl(model); } private static Func<Model, ModelDto> _asDtoImpl; private static Expression<Func<Model, ModelDto>> AsDtoImpl => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // LINQKit handles this };</code>
2。 NeinLinq:
NeinLinq 使用 lambda 注入提供了类似的方法。
<code class="language-csharp">[InjectLambda] public static ModelDto AsDto(Model model) { _asDto ??= AsDto().Compile(); return _asDto(model); } private static Func<Model, ModelDto> _asDto; private static Expression<Func<Model, ModelDto>> AsDto => model => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // NeinLinq handles this };</code>
3。委托反编译器:
DelegateDecompiler 使用计算属性提供更简洁的语法。 请注意,根据映射的复杂性,此方法可能并不总是合适。
<code class="language-csharp">[Computed] public static ModelDto AsDto(Model model) => new ModelDto { ModelId = model.ModelId, ModelName = model.ModelName, ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(), AnotherChildModel = model.AnotherChildModel.AsDto() // DelegateDecompiler handles this };</code>
每个库都需要适当的设置和配置才能在您的项目中正常运行。
结论:
这些库提供了在将单个子属性映射到 EF Core 中的 DTO 时重用代码的有效解决方案,从而减少冗余并提高可维护性。 选择正确的库取决于项目偏好和复杂性。 核心优势是采用一致且 DRY(不要重复)的 DTO 映射方法。
以上是如何重用代码将单个子属性映射到 EF Core 中的 DTO?的详细内容。更多信息请关注PHP中文网其他相关文章!