在 .NET Core Web API for MongoDB 中使用 OData

Posted

技术标签:

【中文标题】在 .NET Core Web API for MongoDB 中使用 OData【英文标题】:Using OData in .NET Core Web API for MongoDB 【发布时间】:2017-12-26 06:41:10 【问题描述】:

.NET Core 现在支持 OData,并且 7.2.0 已发布。但它可以与 MongoDB 一起使用吗?我已经搜索过,但我找不到任何可以说这种或另一种说法的东西。

编辑:

我找到了一个 nuget 包 https://www.nuget.org/packages/microsoft.aspnetcore.odata 并在 ConfigureServices 中添加了这个:

这似乎对我有用:

public void ConfigureServices(IServiceCollection services)

    ...
    services.AddOData();
    services.AddSingleton<IODataModelManger, ODataModelManager>(DefineEdmModel);
    ...


private ODataModelManager DefineEdmModel(IServiceProvider services)

    var modelManager = new ODataModelManager();

    var builder = new ODataConventionModelBuilder();
    builder.EntitySet<TestDTO>(nameof(TestDTO));
    builder.EntityType<TestDTO>().HasKey(ai => ai.Id); // the call to HasKey is mandatory
    modelManager.AddModel(nameof(Something), builder.GetEdmModel());

    return modelManager;

控制器

[HttpGet("all")]
public async Task<IQueryable<TestDTO>> Get()

    // plug your entities source (database or whatever)
    var test = await TestService.GetTest();

    var modelManager = (IODataModelManger)HttpContext.RequestServices.GetService(typeof(IODataModelManger));
    var model = modelManager.GetModel(nameof(Something));
    var queryContext = new ODataQueryContext(model, typeof(TestDTO), null);
    var queryOptions = new ODataQueryOptions(queryContext, HttpContext.Request, Provider);

    return queryOptions
        .ApplyTo(test, new ODataQuerySettings
        
            HandleNullPropagation = HandleNullPropagationOption.True
        , null)
        .Cast<TestDTO>();

服务

public async Task<IQueryable<TestDTO>> GetTest()

    return await GenericRepository.TestAll();

存储库

public async Task<IQueryable<TEntity>> TestAll()

    var res = new GetManyResult<TEntity>();
    try
    
        DateTime startTime = DateTime.Now;
        var collection = GetCollection<TEntity>().AsQueryable();
        var entities = collection.ToArray<TEntity>().AsQueryable();
        return entities

但这是最好的方法吗?

我的意思是,集合不应该只包含满足过滤器的元素,并且更加优化吗?

如果是,我该如何实现?

【问题讨论】:

从技术上讲,如果两者都可以在同一个进程中运行,那么没有什么能阻止您查询 MongoDB 并返回 OData(注意 OData 本身根本不依赖于实体框架),所以答案是“是”。但困难在于如何从 NoSQL/Schema-Less 文档转变为表格数据(OData 是面向表格数据的,它是为 Excel 开发的)?这个问题不可能有一个通用的解决方案。在 CosmosDB 上查看类似的和最近的讨论:***.com/questions/54499430/… 如果您有更精确的问题,我们可以解决。 为什么要将集合转换为数组? ToArray 将在数据库上运行查询,枚举结果以获取数组。这是代码效率低下的唯一原因 (docs.microsoft.com/en-us/dotnet/api/…)。存储库变量“集合”已经是 IQueryable;只是返回。 collection.ToArray&lt;TEntity&gt;() 是错误的 【参考方案1】:

我认为目前在 MongoDB 的 Visual Studio 市场中只有一种连接服务可用。 Link Here.

ODBC Driver for MongoDB 提供高性能且功能丰富的 基于 ODBC 的应用程序访问 MongoDB 的连接解决方​​案 来自 Windows、MacOS、Linux 的数据库。完全支持标准 ODBC API 函数、MongoDB 数据类型和 SQL 查询实现在我们的 驱动程序使您的数据库应用程序与 MongoDB 交互 快速、简单且非常方便。

看起来它可以处理您在连接到 MongoDB 时所期望的所有事情。

但值得注意的是,这只是一条线索,我一直无法找到任何“开源”版本

【讨论】:

值得注意的是,Visual Studio Marketplace 上还有其他选项。 (完全披露,CData Software 是我的雇主)。 CData Software 的 ADO.NET Provider 在 .NET 中提供原生体验:marketplace.visualstudio.com/…。如果您正在寻找为 MongoDB 创建 OData 接口,CData Software 的API Server 就是这样做的。和上面一样,这些都是付费解决方案。 这个答案我不清楚。对于 .NET MVC + SQL Server 环境中的自定义应用程序开发,我们只需使用 nuget 包 Microsoft.AspNet.OData。在 .NET Core + MongoDB 环境中,建议(也是唯一可用的解决方案)使用 MongoDB ODBC 驱动程序 + nuget 包 Microsoft.AspNetCore.OData(目前处于 alpha 阶段)? @Aydus-Matthew 请记住,这已在 7 月得到答复。由于问题的性质,我的回答可能会过时。在这种情况下,例如转向 VS 2017 和可用的 OData 包。我相信您所说的内容是在我发布答案之后发生的。在某个时候,我可能会用最新的回复更新上述答案。 对不起,我很困惑。为什么需要 ODBC 驱动程序来创建 OData 服务? @gyozokudor 在我发布我的答案时,从 OPs 解决方案与 MongoDB 一起工作的唯一双向数据驱动程序将是 OBDC 驱动程序,显然不再是这种情况。当我有机会时,我会更新我的答案以反映实现 OP 要求的当前最佳实践。【参考方案2】:

MongoDB OData 连接器 http://cdn.cdata.com/help/DGB/cd/ 它不是免费的https://www.cdata.com/drivers/mongodb/download/ 概述

MongoDB OData 连接器应用程序使您能够以 OData、JSONP、SOAP、RSS 等流行格式从 MongoDB 安全地访问数据。 入门部分解释了如何建立与 MongoDB 的连接。在本节中,您将找到设置所需连接属性和允许 OData 连接器访问 MongoDB 表的指南。 支持的 OData 部分显示 OData 连接器支持的 OData 语法,并指出查询实时数据时的任何限制。 OData 连接器可以作为独立应用程序安装或与您的服务器集成。在服务器配置部分,您将找到有关如何在现有服务器配置上安装 OData 连接器的信息。此处还列出了系统要求。您还将找到有关如何管理用户和部署 SSL 的说明。日志记录详细说明了可用的日志记录资源。 OData API 允许从任何具有 Web 连接的应用程序访问您的数据。 OData 连接器支持所有主要的身份验证方案。本节记录服务器支持的 HTTP 方法、服务器响应和支持的身份验证方案。 数据模型部分列出了应用程序可用的表、视图和存储过程。

【讨论】:

以上是关于在 .NET Core Web API for MongoDB 中使用 OData的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 2 Web API 超时问题

在 ASP.NET CORE Web API 中获取客户端 IP 地址有问题吗?

使用angular4和asp.net core 2 web api做个练习项目

将文件从 ASP.NET Core Web api 发布到另一个 ASP.NET Core Web api

ASP.NET Core Web Api 自动帮助页面

web API .net - .net core 对比学习-依赖注入