gpt4 book ai didi

c# - 无法使用 AsyncEntitySetController 为单个 OData 实体获取 $expand

转载 作者:太空宇宙 更新时间:2023-11-03 13:23:46 25 4
gpt4 key购买 nike

我无法在单个实体上使用 $expand,但它在集合上运行良好。我有以下异步 OData Web API Controller :

public class AuthorController : AsyncEntitySetController<Author, int>
{
private readonly IAuthorRepository _AuthorRepo = new AuthorRepository();

// GET odata/<controller>
[Queryable]
public override async Task<IEnumerable<Author>> Get()
{
var authors = await _AuthorRepo.GetAll();
return authors.AsQueryable();
}

// GET odata/<controller>/5
[Queryable]
public async Task<Author> Get([FromODataUri]int key)
{
var author = await _AuthorRepo.GetById(key);
return author;
}
}

通过 https://api.acme.org/odata/Authors 请求集合有效,通过 https://api.acme.org/odata/Authors 扩展作者的书籍也是如此?$expand=书籍。

但是,尝试使用上面的 Get 方法扩展单个实体,该方法通过 https://api.acme.org/odata/Authors(1) 接受关键参数?$expand=Books 产生以下错误:

Multiple actions were found that match the request: Get on type AcmeApi.Controllers.AuthorsController Get on type AcmeApi.Controllers.AuthorssController

阅读 this question 的答案后,我尝试通过将我的第二个 Get 方法更新为:

[Queryable]
public SingleResult<Account> Get([FromODataUri]int key)
{
return SingleResult.Create<Account>(m_AccountRepo.GetById(key));
}

但这会导致以下编译错误:

Argument 1: cannot convert from 'System.Threading.Tasks.Task' to 'System.Linq.IQueryable'

异步 ​​GetById 存储库方法是:

public async Task<Author> GetById(int id)
{
return await Task.Run(() => _Authors.Where(a => a.Id == id).SingleOrDefault());
}

如果返回 SingleResult 是让 $expand 为单个实体工作的方法,那么从异步 Controller 执行此操作的正确方法是什么?

最佳答案

Get([FromOdataUri]int key) 重命名为 GetAuthor([]int) 可能会解决此问题。
请引用此贴:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-routing-conventions .

关于c# - 无法使用 AsyncEntitySetController 为单个 OData 实体获取 $expand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23221405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com