Как использовать автоматическое запрашиваемое расширение с OData, вложенный $select

#c# #odata #automapper #iqueryable #.net-5

#c# #odata #автоматический преобразователь #iqueryable #.net-5

Вопрос:

Я пытаюсь реализовать API с использованием OData с DTO с использованием .NET 5.0

 [EnableQuery]
public IActionResult Get(ODataQueryOptions<BookDto> options)
{
    ...

    var books = this._db.Books.ProjectTo<BookDto>();

    return Ok(books);
}
 

Обратите внимание, что параметр «options» присутствует только для того, чтобы я мог проверить инструкции expand (которые исключены для краткости) и использовать явное расширение, в противном случае я полагаюсь на атрибут [EnableQuery] для применения запроса.

Моя модель EDM содержит DTO вместо объектов, например:

 ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<BookDto>("Books");
builder.EntitySet<PressDto>("Presses");
return builder.GetEdmModel();
 

BookDTO содержит навигационную подсказку для нажатия DTO:

 public class BookDto
{
    public int Id { get; set; }
    ... other props
    public PressDto Press { get; set; }
}
    
public class PressDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Category Category { get; set; }
    public PersonDto Owner { get; set; }
}
 

Таким образом, $expands работает довольно хорошо, однако $select внутри expand вызывает исключение:

  • /odata/books?$развернуть= Нажать -> это работает нормально
  • /odata/books?$expand=Press($expand= Владелец) -> это работает нормально
  • /odata/books?$select=Title -> это работает нормально

— /odata/books?$развернуть=Нажать($выбрать=Категория) -> это вызывает исключение

Система.Исключение InvalidOperationException: перезапись дочернего выражения из типа ‘ODataPoc.Модели.Система категорий «для ввода».Nullable`1[ODataPoc.Модели.Категория]’ не допускается, потому что это изменило бы смысл операции. Если это сделано намеренно, переопределите ‘VisitUnary’ и измените его, чтобы разрешить это rewrite.at System.Linq.Выражения.Экспрессионный посетитель.ValidateChildType(введите до, Введите после, строковое имя метода)в System.Linq.Выражения.ExpressionVisitor.ValidateUnary(UnaryExpression до, UnaryExpression после) в Microsoft.EntityFrameworkCore.Запрос.Внутренний.QueryOptimizingExpressionVisitor.VisitUnary(унарное выражение UnaryExpression)

Если я использую сущности вместо DTO, а не ProjectTo, все работает нормально. Значит, с проектом что-то не так, я просто не могу понять, что именно. Если возможно, я бы хотел использовать DTO, так что любая помощь будет очень признательна.

Комментарии:

1. github.com/AutoMapper/AutoMapper . Расширения. ОДата

2. Я проверил это, но не смог заставить его работать с .NET 5.0, поскольку OData находится только в состоянии предварительного просмотра для .NET 5.0. Должен ли я просто начать с .NET Core 3.1, а затем обновить, когда смогу?

3. Я так думаю. Этот пакет предназначен для работы с OData, ProjectTo но не в такой степени.