【发布时间】:2021-02-02 15:11:35
【问题描述】:
我正在尝试将 OData 与 .NET Core WebApi 项目一起使用。因为我想控制输出的格式,所以我采取了一种可能不是很传统的方法,并且在我的操作中,我收到了一个 ODataQueryOptions 输入,我将其应用于我的数据源——一个通过 EF Core 公开的 CosmosDb 集合。 代码方面,我在启动时有类似的东西:
public void ConfigureServices(IServiceCollection services)
{
....
services.AddOData();
....
}
和
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
....
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.EnableDependencyInjection();
/* tried even
endpoints.EnableDependencyInjection(builder =>
{
builder.AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(ODataUriResolver), sp => new StringAsEnumResolver());
});
*/
endpoints.Filter();
});
...
}
控制器很简单:
namespace Tacx.Backend.Activity.Api.Controllers
{
[Route("api/activities/search")]
[ApiController]
public class SearchController : ControllerBase
{
private readonly ActivityContext _db;
private readonly IMapper _mapper;
public SearchController(ActivityContext db, IMapper mapper)
{
_db = db;
_mapper = mapper;
}
[HttpGet]
public async Task<List<ActivitySummaryDTO>> GetActivities(ODataQueryOptions<Domain.Models.Activity> opts)
{
try
{
var odataResult = opts.ApplyTo(_db.Activities.AsQueryable());
var activities = odataResult as IQueryable<Domain.Models.Activity>;
var activitiesDto= _mapper.Map<List<ActivitySummaryDTO>>(activities);
return activitiesDto;
}
catch(Exception ex)
{
throw ex;
}
}
}
}
如果我对字符串、GUID 或数字的属性进行过滤,这会很好。每当我尝试对枚举字段运行过滤器时(它们以字符串形式存储在 CosmosDB 中),我都会遇到问题......
我一直在尝试使用 $filter=MyPropertyEnum eq 'enumValue' 等过滤器,但出现错误:Invalid cast from 'System.Int32' to 'Activity.Domain.Enums.MyPropertyEnum'.
我一直在尝试在 Google 上寻求解决方案,但到目前为止找不到任何解决方案...欢迎任何帮助或建议。 谢谢!
【问题讨论】:
-
也许你可以看到这个link,希望它能帮助你。
-
@yinqiu 就是这样......我不敢相信:|最糟糕的是他们不打算在 3.x.x 中实现它,所以我不得不拿一个 RC.... 非常感谢!请添加回复,以便我接受并关闭此问题。再次感谢!
标签: asp.net-core odata asp.net-core-webapi asp.net-core-3.1