【问题标题】:How to return different Object Type based on Condition in HTTP Response (.net core)如何根据 HTTP 响应中的条件返回不同的对象类型(.net 核心)
【发布时间】:2020-08-25 16:48:33
【问题描述】:

我有一个 EF 模型类、一个 DTO BaseClass 和一个从 BaseClass 扩展的 DTO AdminClass。我从 EF 获取数据并使用 AutoMapper 类使用下面的代码转换为适当的对象。

public async Task<object> GetItems()
{
    object nearestItems = _dbContext.Items.ToList(); // Gets it from DBContext.Items....
    var dtoList = IsAuthenticated ? MapObject<IEnumerable<AdminClass>>(nearestItems) : MapObject<IEnumerable<BaseClass>>(nearestItems);
    return dtoList;
}

private T MapObject<T>(object obj)
{
    object convertedObject = null;
    //convertedObject = IsAuthenticated ? _mapper.Map<IList<AdminClass>>(obj) : _mapper.Map<BaseClass>(obj);
    return (T)convertedObject;
}

但是当响应被发回时,这只会返回BaseClass 属性,即使它已经过身份验证并且应该返回AdminClass 属性以及BaseClass。为了返回适当的对象,我必须使用 If/Else 条件,而不是 三元 运算符,并且必须使用 AdminClassWithoutBaseClass 来返回所有属性。虽然不理想,因为我必须在之后进行一些其他操作,但它确实有效。但是,我想知道如何使它与上述语法一起使用,以及是否有一种简洁的编写方式。

您可以在Dotnetfiddle 上查看示例代码。

【问题讨论】:

    标签: c# entity-framework .net-core automapper generic-list


    【解决方案1】:

    这听起来像是延迟加载问题。在 .net Core 上,您必须使用代理启用延迟加载扩展属性。这是一篇关于它的深入博客文章:https://www.learnentityframeworkcore.com/lazy-loading

    您需要添加 Microsoft.EntityFrameworkCore.Proxies nuget 包,并在实例化上下文服务时启用它。

    services.AddDbContext<SomeContext>(options =>
        options.UseLazyLoadingProxies());
    

    【讨论】:

    • 我认为它与 EF 或延迟加载无关。列表已经缓存在内存中(使用 .net 核心缓存)并且已经将数据转换为适当的类型。问题是当 HTTP 响应被发送回来时,它只返回基本类型的属性。
    • 因此,如果您在其中设置断点并查看缓存返回的内容,然后再将其作为 http 响应发送,它实际上是否包含 AdminClass 的值?
    • FYI 缓存用于 EF 列表,因此我不必往返 DB。是的,我确实在控制器操作上看到了 AdminClass List return list;,但在响应基类列表上。
    • 你结婚了吗?我可以通过手动转换来完成。完整示例太长,无法评论...
    • dotnetfiddle上手动转换的工作示例
    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2019-01-29
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多