首页 > 后端开发 > C++ > 如何重用代码将单个子属性映射到 EF Core 中的 DTO?

如何重用代码将单个子属性映射到 EF Core 中的 DTO?

Susan Sarandon
发布: 2025-01-23 19:41:09
原创
650 人浏览过

How Can I Reuse Code for Mapping Single Child Properties to DTOs in EF Core?

简化 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板