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中执行查询。