Использование Automapper 10.1.1 и HotChocolate 11.1 для сопоставления запросов

Я пытаюсь спроецировать свои запросы EF Core с помощью Automapper, чтобы разрешить 3-й уровень в моем приложении, но у меня есть некоторые проблемы с тем, чтобы разрешить HotChocolate запрашивать поля в моем DTO и сообщить Automapper включить эти поля в процесс проектирования.

Несколько важных моментов заранее:

  • Automapper запросит все свойства NavigationProperties на карте, если присутствуют оба свойства.
  • За исключением случаев, когда присутствует настройка ExplicitExpansion
  • Если на карте установлен ExplicitExpansion, HotChocolate не может расширить навигационные свойства IQueryable с использованием [UseProjection].

Таким образом, я мог либо загрузить все свойства навигации сразу, либо ничего.

Как я могу указать ether HotChocolate отображать объекты в моем IQueryable или как я могу получить необходимые ключи в моей функции запроса, чтобы сообщить AutoMapper, какие свойства следует расширить с помощью метода IQueryable<T>.ProjectTo()?


person Venson    schedule 27.04.2021    source источник


Ответы (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();
}
person Pascal Senn    schedule 27.04.2021
comment
К сожалению, это не работает. Проекция HotChocolate применяется после того, как автосопоставитель спроецировал объект в пределах GetFooDtos и, следовательно, расширил все или ни одного свойства навигации. - person Venson; 27.04.2021
comment
gist.github.com/JPVenson/4c8fce7aec5930a95206c780b7e68eba точки. Есть ли способ получить все поля, запрошенные у HotChocolate? Затем я мог бы использовать их в своем запросе, чтобы сообщить AutoMapper, какие поля следует расширить. - person Venson; 27.04.2021
comment
Если порядок является проблемой, вы также можете создать свои собственные атрибуты. я обновлю ответ - person Pascal Senn; 27.04.2021
comment
Эй, большое спасибо за идею с пользовательским промежуточным программным обеспечением, это определенно шаг в правильном направлении. Но теперь я получаю сообщение об ошибке. Кажется, HotChocolate не любит, когда я меняю тип результата. Ошибка: gist.github.com/JPVenson/825c1fd29a1b33ad84c85723dac98eb2 - person Venson; 27.04.2021
comment
У вас есть доступ к типу, поэтому вы также можете изменить тип, я снова обновлю - person Pascal Senn; 27.04.2021
comment
Я попробовал явную настройку типа, но это приводит к другой ошибке HotChocolate. gist.github.com/JPVenson/ - person Venson; 27.04.2021
comment
@Venson, ты можешь сначала жестко закодировать типы? просто чтобы убедиться, что это будет работать, если типы установлены правильно. - person Pascal Senn; 28.04.2021
comment
да, я тоже пробовал, та же ошибка - person Venson; 28.04.2021