C# Odata$expand韩元';无法处理特定的查询
我们正在为一个web应用程序制作一个ASP.NET核心API,该应用程序应该从带有实体框架的SQL Server数据库中获取一个用户列表(并扩展一个特定字段)。直到我们在URL中指定所需的用户Id为止 以下是C# Odata$expand韩元';无法处理特定的查询,c#,asp.net-core,odata,C#,Asp.net Core,Odata,我们正在为一个web应用程序制作一个ASP.NET核心API,该应用程序应该从带有实体框架的SQL Server数据库中获取一个用户列表(并扩展一个特定字段)。直到我们在URL中指定所需的用户Id为止 以下是启动类: 公共类启动 { 公共启动(IConfiguration配置) { 配置=配置; } 公共IConfiguration配置{get;} 私有静态IEdmModel GetEdmModel() { ODataConventionModelBuilder=新ODataConvention
启动
类:
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
私有静态IEdmModel GetEdmModel()
{
ODataConventionModelBuilder=新ODataConventionModelBuilder();
builder.EntitySet(“用户”);
builder.EntitySet(“字符”);
返回builder.GetEdmModel();
}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(opts=>opts.UseSqlServer(配置[“ConnectionString:Gaium]”);
services.AddOData();
services.AddMvc(选项=>
{
options.EnableEndpointRouting=false;
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
//默认的HSTS值为30天。您可能希望在生产场景中更改此值,请参阅https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseMvc(b=>
{
b、 EnableDependencyInjection();
b、 Select().Expand().Filter().OrderBy().MaxTop(100.Count());
b、 MapODataServiceRoute(“api”、“api”、GetEdmModel());
});
}
}
以下是DbContext
:
公共类GaiumContext:DbContext
{
public GaiumContext(DbContextOptions):基本(选项)
{
}
公共数据库集用户{get;set;}
公共数据库集字符{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()有许多(c=>c.Characters);
}
}
最后,控制器用户控制器:
public class UsersController : ODataController
{
private GaiumContext _context;
public UsersController(GaiumContext context)
{
_context = context;
}
[EnableQuery]
public IActionResult Get()
{
return Ok(_context.Users);
}
[EnableQuery]
public IActionResult Get(long key)
{
return Ok(_context.Users.Find(key));
}
}
用户对象如下所示:
Users {
id: int,
name: string,
Characters: [{
id: int,
name: String
}]
}
以下是针对所有用户的查询:
GET: https://localhost:44323/api/users?$expand=Characters
在这种情况下,查询工作正常,我们确实收到了用户列表以及他们的字符字段
{"@odata.context":"https://localhost:44323/api/$metadata#Users","value":[{"Id":1,"Username":"Ok","Characters":[{"Id":1,"Name":"bigusernamesmoke"}]}]}
但当我们尝试使用某个特定用户的ID获取结果时,字符列表为空:
GET: https://localhost:44323/api/users/1?$expand=Characters
请注意,Find(key)
方法返回一个单一的
而不是可查询的对象:
返回Ok(_context.Users.Find(key))
如果我更改您的代码以返回一个SingleResult
,如下所示:
[EnableQuery]
public SingleResult<User> Get(long key)
{
var query = _context.Users.Where(p => p.Id == key);
return SingleResult.Create(query);
}
[启用查询]
公共单结果获取(长键)
{
var query=_context.Users.Where(p=>p.Id==key);
返回SingleResult.Create(查询);
}
这对我来说很好
[EnableQuery]
public SingleResult<User> Get(long key)
{
var query = _context.Users.Where(p => p.Id == key);
return SingleResult.Create(query);
}