.Net Core 上的 OData 在 $select 上没有 return 正确的结果
OData on .Net Core doesn't return the right results on $select
我已将 OData 添加到我的 WebAPI 项目中。
版本:
- 核心 3.1
- OData 7.3.0(测试版以便与 Core 3.x 一起使用)
- EF 核心 3.1.0
这是我的startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<Models.Contexts.EntityContext>(opts => opts.UseSqlServer(Configuration["ConnectionString:MailBackup"]));
services.AddControllers();
services.AddMvc(options =>
{
options.EnableEndpointRouting = false;
}).SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_3_0);
services.AddOData();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc(routeBuilder =>
{
routeBuilder.EnableDependencyInjection();
routeBuilder.Expand().Select().OrderBy().Filter();
});
app.UseHttpsRedirection();
app.UseAuthorization();
}
}
控制器是:
[EnableQuery()]
[HttpGet]
[Route("GetAll")]
public IQueryable<Models.EmailMessage> GetAll()
{
return this._context.EmailMessages;
}
API 工作正常,但是当我尝试添加一些 OData 操作(如 $select 时,我得到以下结果而不是预期结果:
{
"instance": null,
"container": {},
"modelID": "529e8054-04c4-4729-aa91-d7eaf67a55d0",
"untypedInstance": null,
"instanceType": null,
"useInstanceForProperties": false
},
{
"instance": null,
"container": {},
"modelID": "529e8054-04c4-4729-aa91-d7eaf67a55d0",
"untypedInstance": null,
"instanceType": null,
"useInstanceForProperties": false
},
The APIs are working fine, but when I try to add some OData action like $select I get the following and not the expected results
我可以在我的 .NET Core 3.x
应用程序中使用与您分享的代码类似的代码重现相同的问题,目前似乎无法很好地支持使用以下代码片段将 OData 服务注入现有 API 控制器对于 .NET 核心 3.x.
routeBuilder.EnableDependencyInjection();
并且根据我的测试,它可以在 .NET Core 2.x
中正常运行。为了使 $select
功能在 .NET Core 3.x
中正常工作,目前,我们可以尝试以下解决方法:
在Startup.cs
var builder = new ODataConventionModelBuilder(app.ApplicationServices);
builder.EntitySet<Product>("Products");
app.UseMvc(routeBuilder =>
{
// and this line to enable OData query option, for example $filter
routeBuilder.Expand().Select().OrderBy().Filter();
routeBuilder.MapODataServiceRoute("ODataRoute", "api", builder.GetEdmModel());
});
在 ODataController
public class ProductsController : ODataController
{
// ...
//code logic here
// ...
[HttpGet]
[EnableQuery]
public IQueryable<Product> Get()
{
var products = _context.Products;
return products;
}
// ...
}
测试结果
更多信息请查看:https://docs.microsoft.com/en-us/odata/webapi/netcore#e-configure-the-odata-endpoint
我遇到了同样的问题。这为我解决了问题。也许 odata 与 Asp.Net 3.1 中新的 JSON 序列化程序不完全兼容。我不知道。
services.AddControllers(mvcOptions =>
mvcOptions.EnableEndpointRouting = false)
.AddNewtonsoftJson();
我已将 OData 添加到我的 WebAPI 项目中。
版本:
- 核心 3.1
- OData 7.3.0(测试版以便与 Core 3.x 一起使用)
- EF 核心 3.1.0
这是我的startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<Models.Contexts.EntityContext>(opts => opts.UseSqlServer(Configuration["ConnectionString:MailBackup"]));
services.AddControllers();
services.AddMvc(options =>
{
options.EnableEndpointRouting = false;
}).SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_3_0);
services.AddOData();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc(routeBuilder =>
{
routeBuilder.EnableDependencyInjection();
routeBuilder.Expand().Select().OrderBy().Filter();
});
app.UseHttpsRedirection();
app.UseAuthorization();
}
}
控制器是:
[EnableQuery()]
[HttpGet]
[Route("GetAll")]
public IQueryable<Models.EmailMessage> GetAll()
{
return this._context.EmailMessages;
}
API 工作正常,但是当我尝试添加一些 OData 操作(如 $select 时,我得到以下结果而不是预期结果:
{
"instance": null,
"container": {},
"modelID": "529e8054-04c4-4729-aa91-d7eaf67a55d0",
"untypedInstance": null,
"instanceType": null,
"useInstanceForProperties": false
},
{
"instance": null,
"container": {},
"modelID": "529e8054-04c4-4729-aa91-d7eaf67a55d0",
"untypedInstance": null,
"instanceType": null,
"useInstanceForProperties": false
},
The APIs are working fine, but when I try to add some OData action like $select I get the following and not the expected results
我可以在我的 .NET Core 3.x
应用程序中使用与您分享的代码类似的代码重现相同的问题,目前似乎无法很好地支持使用以下代码片段将 OData 服务注入现有 API 控制器对于 .NET 核心 3.x.
routeBuilder.EnableDependencyInjection();
并且根据我的测试,它可以在 .NET Core 2.x
中正常运行。为了使 $select
功能在 .NET Core 3.x
中正常工作,目前,我们可以尝试以下解决方法:
在Startup.cs
var builder = new ODataConventionModelBuilder(app.ApplicationServices);
builder.EntitySet<Product>("Products");
app.UseMvc(routeBuilder =>
{
// and this line to enable OData query option, for example $filter
routeBuilder.Expand().Select().OrderBy().Filter();
routeBuilder.MapODataServiceRoute("ODataRoute", "api", builder.GetEdmModel());
});
在 ODataController
public class ProductsController : ODataController
{
// ...
//code logic here
// ...
[HttpGet]
[EnableQuery]
public IQueryable<Product> Get()
{
var products = _context.Products;
return products;
}
// ...
}
测试结果
更多信息请查看:https://docs.microsoft.com/en-us/odata/webapi/netcore#e-configure-the-odata-endpoint
我遇到了同样的问题。这为我解决了问题。也许 odata 与 Asp.Net 3.1 中新的 JSON 序列化程序不完全兼容。我不知道。
services.AddControllers(mvcOptions =>
mvcOptions.EnableEndpointRouting = false)
.AddNewtonsoftJson();