【问题标题】:Using Automapper 10.1.1 and HotChocolate 11.1 to map queryables使用 Automapper 10.1.1 和 HotChocolate 11.1 映射可查询对象
【发布时间】:2021-07-20 20:29:57
【问题描述】:

我正在尝试使用 Automapper 投影我的 EF Core 查询以允许在我的应用程序中使用第 3 层,但我在允许 HotChocolate 请求我的 DTO 上的字段并告诉 Automapper 在投影过程中包含这些字段时遇到了一些麻烦。

一些重要的事前说明:

  • 当两个属性都存在时,Automapper 将请求地图上的所有 NavigationProperties
  • ExplicitExpansion 设置存在时除外
  • 如果在地图上设置了ExplicitExpansion,HotChocolate 无法使用[UseProjection] 扩展IQueryable 的导航属性

所以我可以一次性加载所有导航属性,也可以不加载。

如何告诉 ether HotChocolate 映射我的 IQueryable 中的实体,或者如何在我的查询函数中获取所需的键来告诉 AutoMapper 使用 IQueryable<T>.ProjectTo() 方法扩展哪些属性?

【问题讨论】:

    标签: c# entity-framework-core automapper hotchocolate


    【解决方案1】:

    你试过了吗?

    public class Query
    {
        [UseProjection] //<----
        public IQueryable<FooDto> GetFoos([Service]YourService svc)=> svc.GetFooDtos();
    }
    

    如果投影不是太复杂,这应该可以工作

    如果投影顺序有问题,您还可以创建自定义属性

        public class YourCustomMiddlewareAttribute : ObjectFieldDescriptorAttribute
        {
            public override void OnConfigure(
                IDescriptorContext context, 
                IObjectFieldDescriptor descriptor, 
                MemberInfo member)
            { 
                descriptor.Type<ListType<ObjectType<PersonDto>>>();
                descriptor.Use(next => async context =>
                {
                    await next(context);
                    if (context.Result is IQueryable<Person> persons)
                    { 
                        context.Result = persons
                             .ProjectTo<PersonDto>()
                             .ToListAsync(context.RequestAborted);
                    }
                })
            }
        }
    
    public class Query
    {
        [YourCustomMiddleware]
        [UseProjection]
        public IQueryable<FooDto> GetFoos([Service]YourService svc)=> svc.GetFooDtos();
    }
    

    【讨论】:

    • 不幸的是,这不起作用。 HotChocolate Projection automapper 将实体投影到GetFooDtos 之后应用,因此扩展了所有或无导航属性。
    • gist.github.com/JPVenson/4c8fce7aec5930a95206c780b7e68eba 这是我在 3 点中使用和解释的查询。有没有办法从 HotChocolate 获取所有请求的字段?然后我可以在查询中使用它们来告诉 AutoMapper 应该扩展哪些字段
    • 如果订单有问题,您还可以创建自定义属性。我会更新答案
    • 嘿,非常感谢您提供自定义中间件的想法,这绝对是朝着正确方向迈出的一步。但现在我遇到了一个错误。当我更改结果类型时,HotChocolate 似乎不喜欢它。错误:gist.github.com/JPVenson/825c1fd29a1b33ad84c85723dac98eb2
    • 你确实可以访问类型,所以你也可以更改类型我会再次更新
    猜你喜欢
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多