【发布时间】: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 上查看类似的和最近的讨论:stackoverflow.com/questions/54499430/… 如果您有更精确的问题,我们可以解决。
-
为什么要将集合转换为数组? ToArray
将在数据库上运行查询,枚举结果以获取数组。这是代码效率低下的唯一原因 (docs.microsoft.com/en-us/dotnet/api/…)。存储库变量“集合”已经是 IQueryable ;只是返回。 -
collection.ToArray<TEntity>()是错误的
标签: c# mongodb asp.net-web-api asp.net-core odata