Задача такая: необходимо перед этим получить результат выполнения запроса в базу данных отправка его клиенту.
Я использую .NET 8.0 и Microsoft.AspNetCore.OData 9.0.0
Я пробую классическую реализацию применения queryOptions через .ApplyTo(IQueryable query), но я получаю результат, который мне не совсем нужен — SelectSome. Я хотел бы получить результат в формате JSON или привести к продукту
Код: Выделить всё
[HttpGet("get")]
[EnableQuery]
public async Task Get(ODataQueryOptions
queryOptions, CancellationToken cancellationToken)
{
var resultQuery = (IQueryable) queryOptions.ApplyTo(dbContext.Products.AsQueryable());
var result = await resultQuery.ToListAsync(cancellationToken: cancellationToken);
//some other actions
return Ok(result);
}
Код: Выделить всё
[Route("odata/Products")]
[Authorize]
public class ProductsOdataController(ApplicationDbContext dbContext) : ODataController
{
[HttpGet("get")]
[EnableQuery]
[OdataResultFilter]
public IActionResult Get()
{
return Ok(dbContext.Products.AsQueryable());
}
}
public class OdataResultFilter : Attribute, IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
}
public void OnActionExecuted(ActionExecutedContext context)
{
var json = JsonConvert.SerializeObject(objectResult.Value);
objectResult.Value = json;
}
}
Я есть еще один вариант использования .Cast()
Код: Выделить всё
[HttpGet("get")]
[EnableQuery]
public async Task Get(ODataQueryOptions queryOptions, CancellationToken cancellationToken)
{
var resultQuery = queryOptions.ApplyTo(dbContext.CrmContractors.AsQueryable()).Cast();
var result = await resultQuery.Select(wrapper => wrapper.ToDictionary()).ToListAsync(cancellationToken);
//some other actions
return Ok(result);
}
Код: Выделить всё
https://localhost/odata/Products?$expand=Orders
Код: Выделить всё
KeyValuePair() {
Key = "Orders",
Value = List...
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... t-in-net-8