Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Odata$expand韩元';无法处理特定的查询_C#_Asp.net Core_Odata - Fatal编程技术网

C# Odata$expand韩元';无法处理特定的查询

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

我们正在为一个web应用程序制作一个ASP.NET核心API,该应用程序应该从带有实体框架的SQL Server数据库中获取一个用户列表(并扩展一个特定字段)。直到我们在URL中指定所需的用户Id为止

以下是
启动
类:

公共类启动
{
公共启动(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);
}