C# 在MongoDB的.NET核心Web API中使用OData

C# 在MongoDB的.NET核心Web API中使用OData,c#,mongodb,asp.net-web-api,asp.net-core,odata,C#,Mongodb,Asp.net Web Api,Asp.net Core,Odata,OData现在在.NETCore中受支持,7.2.0已经发布。但是它可以与MongoDB一起使用吗?我已经找过了,但我找不到任何能说明这种或那种情况的东西 编辑: 我找到了一个nuget软件包,并在ConfigureServices中添加了以下内容: 这似乎对我有用: public void ConfigureServices(IServiceCollection services) { ... services.AddOData(); services.AddSingl

OData现在在.NETCore中受支持,7.2.0已经发布。但是它可以与MongoDB一起使用吗?我已经找过了,但我找不到任何能说明这种或那种情况的东西

编辑:

我找到了一个nuget软件包,并在
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;
}
public void配置服务(IServiceCollection服务)
{
...
services.AddOData();
服务。添加Singleton(定义MModel);
...
}
专用ODataModelManager DefineEdmModel(IServiceProvider服务)
{
var modelManager=new ODataModelManager();
var builder=新的ODataConventionModelBuilder();
builder.EntitySet(nameof(TestDTO));
builder.EntityType().HasKey(ai=>ai.Id);//对HasKey的调用是必需的
modelManager.AddModel(nameof(某物),builder.GetEdmModel());
返回模型管理器;
}
控制器

[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>();
}
[HttpGet(“全部”)]
公共异步任务Get()
{
//插入您的实体源(数据库或其他)
var test=await TestService.GetTest();
var modelManager=(iodatamodelmanager)HttpContext.RequestServices.GetService(typeof(iodatamodelmanager));
var model=modelManager.GetModel(某物的名称);
var queryContext=new-ODataQueryContext(model,typeof(TestDTO),null);
var queryOptions=新的ODataQueryOptions(queryContext,HttpContext.Request,Provider);
返回查询选项
.ApplyTo(测试、新ODataQuerySettings
{
HandleNullPropagation=HandleNullPropagationOption.True
},空)
.Cast();
}
服务

public async Task<IQueryable<TestDTO>> GetTest()
{
    return await GenericRepository.TestAll();
}
public异步任务GetTest()
{
return wait 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
}
公共异步任务TestAll()
{
var res=new GetManyResult();
尝试
{
DateTime startTime=DateTime.Now;
var collection=GetCollection().AsQueryable();
var entities=collection.ToArray().AsQueryable();
返回实体
}
但这是最好的方法吗

我的意思是,该系列不应该只包含符合过滤器要求的元素,从而更加优化吗


如果是,我该如何实现这一点?

我认为目前在visual studio市场上,MongoDB只有一种连接服务可用

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

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

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

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

值得注意的是,Visual Studio Marketplace上还有其他选项。(完全公开,CData软件是我的雇主)。CData软件提供的ADO.NET Provider在.NET中提供了本机体验:。如果您希望为MongoDB创建OData接口,则使用CData软件即可。如上所述,这些都是付费解决方案。我不清楚这个答案。对于.NET MVC+SQL Server环境中的自定义应用程序开发,我们只需使用nuget包Microsoft.AspNet.OData。在.NET Core+MongoDB环境中,建议(也是唯一可用的解决方案)使用MongoDB ODBC驱动程序+nuget软件包Microsoft.AspNetCore.OData(当前为alpha)?@Aydus Matthew请记住,这是在7月份回答的。由于问题的性质,我的答案可能会过时。在这种情况下,我的答案可能会变成VS 2017和OData软件包。我相信你所说的是在我的答案发布之后。在某个时候,我可能会更新ab用最新的响应更新答案。很抱歉,我很困惑。为什么您需要ODBC驱动程序来创建OData服务?@gyozokudor在我发布答案时,OPs解决方案中唯一一个与MongoDB一起工作的双向数据驱动程序应该是OBDC驱动程序,这显然不再是事实。如果有机会,我会更新我的回答反映了当前实现OP要求的最佳实践。从技术上讲,如果MongoDB和OData可以在同一个过程中运行(注意OData本身根本不与实体框架绑定),那么没有什么可以阻止您查询MongoDB和返回OData,因此answe