将 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();
}