C# OData SingleResult具有有效的非404空值
我有一个模型:C# OData SingleResult具有有效的非404空值,c#,asp.net-core,odata,asp.net-core-3.1,C#,Asp.net Core,Odata,Asp.net Core 3.1,我有一个模型: public class Foo { public int Id { get; set; } public string Name { get; set; } public Bar Bar { get; set; } } public class Bar { public int Id { get; set; } public string Name { get; set; } public Buzz Buzz { get; se
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public Bar Bar { get; set; }
}
public class Bar
{
public int Id { get; set; }
public string Name { get; set; }
public Buzz Buzz { get; set; }
}
public class Buzz
{
public int Id { get; set; }
public string Name { get; set; }
}
我想向OData提出如下请求:
/odata/Foos
/odata/Foos(1)
/odata/Foos(2)/Bar
/odata/Foos(2)/Bar?$expand=Buzz
对于/odata/Foos({ID})/Bar
请求,在属性为null的情况下,返回null(NoContent/204)而不是404是很自然的。但我正在努力以有效的方式实现这一点
我目前的解决办法是:
[EnableQuery]
public IActionResult GetBar(int key)
{
var barQuery = storage.AsQueryable()
.Where(p => p.Id == key)
.Select(p => p.Bar);
if (!barQuery.Any()) // Ok to return null if even Foo not exists
{
return NoContent();
}
return Ok(SingleResult.Create(barQuery));
}
它有问题-我们必须访问数据库两次-检查Any()
,然后在查询枚举过程中检查结果
是否可以通过单个数据库请求来实现这一点?
想法是实现类似于ValidNullableSingleResult
的东西,它不会像SingleResult
那样为null生成404
注:
我们有一些可能的查询,如
/odata/Foos(2)/Bar?$expand=Buzz
,这意味着我们必须处理IQueryable,而不能只使用SingleOrDefault()
,然后返回结果。@Lightman这与任何()额外数据库请求几乎相同。在所有情况下,我都试图通过一个请求来实现。您好,@Vladimir,Entity Framework Plus-将帮助您在一个SQL中执行查询。@Lightman它将与任何()额外数据库请求几乎相同。在所有情况下,我都试图通过一个请求来实现。您好,@Vladimir,Entity Framework Plus-将帮助您在一个SQL中执行查询。