#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
но не в такой степени.