将 Microsoft Graph 添加到现有 Entity Framework 核心
Adding Microsoft Graph to existing Entity Framework Core
我在 .NET 5 上得到了一个 API,使用 Entity Framework Core 制作。
带有方法的查询 URL 类似于 GET https://api.mydomain.ch/v1/applicationusers
这将检索所有应用程序用户(这是有道理的)。
在 C# 中看起来是:
[HttpGet]
public async Task<ActionResult<ApplicationUser>> Get()
{
return Ok(await _applicationUserRepository.GetAll());
}
现在一个客户端消费我的 API 想要请求:GET https://api.mydomain.ch/v1/applicationusers?$filter=startswith(givenName,'Peter')
我看到它与 Microsoft Graph API 及其查询参数匹配。我的客户也想为此使用其他实现 (https://docs.microsoft.com/en-us/graph/query-parameters)
我找不到任何适用于 Entity Framework Core 的实施示例。有没有可能用简单的方法实现这个,而不是对数据库做大的修改?
我需要完全自己实现功能吗?或者在这些查询参数函数和 Entity Framework Core 之间是否有 Microsoft 的支持?
好吧,答案很简单,需要实施的不是 Microsoft Graph,而是 OData
。
对于 .NET 5,没有很好的文档记录,因为此 .NET 版本的 NuGet 仍处于 RC 状态(预发布)。
要实现OData,我们需要在nuget包中添加Microsoft.AspNetCore.OData
。 我的答案是用 8.0.0-rc
中的状态写的。对于 v7.x,调用看起来有点不同,但有更好的记录。
我们需要做的是:
在StartUp.ConfigureServices
中添加OData:
ODataConventionModelBuilder builder = new(new DefaultAssemblyResolver());
builder.EntitySet<ApplicationUser>("ApplicationUser");
IEdmModel model = builder.GetEdmModel();
services.AddOData(opt =>
{
opt
.AddModel("api/v1", model)
.Select()
.Expand()
.OrderBy()
.Filter()
.Count();
});
与 .Select().Expand().OrderBy().Filter().Count()
一起为 $select、$expand、...
添加 api-查询参数
我在 Configure()
中的 UseEndpoints
调用看起来是这样的:
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
确保控制器继承自 ODataApiController
。
一个动作看起来像这样:
[HttpGet]
[EnableQuery]
public async Task<ActionResult<ApplicationUser>> Get()
{
return Ok(await _applicationUserRepository.GetAll());
}
这不会执行预期的查询。我们需要 return 和 IQueryable<T>
才能完成这项工作,因此我们不会查询所有记录:
[HttpGet]
[EnableQuery]
public IQueryable<ApplicationUser> Get()
{
return _applicationUserRepository.GetAll();
}
我在 .NET 5 上得到了一个 API,使用 Entity Framework Core 制作。
带有方法的查询 URL 类似于 GET https://api.mydomain.ch/v1/applicationusers
这将检索所有应用程序用户(这是有道理的)。
在 C# 中看起来是:
[HttpGet]
public async Task<ActionResult<ApplicationUser>> Get()
{
return Ok(await _applicationUserRepository.GetAll());
}
现在一个客户端消费我的 API 想要请求:GET https://api.mydomain.ch/v1/applicationusers?$filter=startswith(givenName,'Peter')
我看到它与 Microsoft Graph API 及其查询参数匹配。我的客户也想为此使用其他实现 (https://docs.microsoft.com/en-us/graph/query-parameters)
我找不到任何适用于 Entity Framework Core 的实施示例。有没有可能用简单的方法实现这个,而不是对数据库做大的修改?
我需要完全自己实现功能吗?或者在这些查询参数函数和 Entity Framework Core 之间是否有 Microsoft 的支持?
好吧,答案很简单,需要实施的不是 Microsoft Graph,而是 OData
。
对于 .NET 5,没有很好的文档记录,因为此 .NET 版本的 NuGet 仍处于 RC 状态(预发布)。
要实现OData,我们需要在nuget包中添加Microsoft.AspNetCore.OData
。 我的答案是用 8.0.0-rc
中的状态写的。对于 v7.x,调用看起来有点不同,但有更好的记录。
我们需要做的是:
在StartUp.ConfigureServices
中添加OData:
ODataConventionModelBuilder builder = new(new DefaultAssemblyResolver());
builder.EntitySet<ApplicationUser>("ApplicationUser");
IEdmModel model = builder.GetEdmModel();
services.AddOData(opt =>
{
opt
.AddModel("api/v1", model)
.Select()
.Expand()
.OrderBy()
.Filter()
.Count();
});
与 .Select().Expand().OrderBy().Filter().Count()
一起为 $select、$expand、...
我在 Configure()
中的 UseEndpoints
调用看起来是这样的:
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
确保控制器继承自 ODataApiController
。
一个动作看起来像这样:
[HttpGet]
[EnableQuery]
public async Task<ActionResult<ApplicationUser>> Get()
{
return Ok(await _applicationUserRepository.GetAll());
}
这不会执行预期的查询。我们需要 return 和 IQueryable<T>
才能完成这项工作,因此我们不会查询所有记录:
[HttpGet]
[EnableQuery]
public IQueryable<ApplicationUser> Get()
{
return _applicationUserRepository.GetAll();
}