在 .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/… 如果您有更精确的问题,我们可以解决。 为什么要将集合转换为数组? ToArraycollection.ToArray<TEntity>()
是错误的
【参考方案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 Web API 中获取客户端 IP 地址有问题吗?
使用angular4和asp.net core 2 web api做个练习项目