我尝试像这样过滤我的mongo集合:
public IMongoCollection<T> GetCollection<T>()
where T : class
{
return _database.GetCollection<T>(typeof(T).Name);
}
public IMongoQueryable<TModel> Get<TModel>() where TModel : class
{
return GetCollection<TModel>().AsQueryable();
}
public async Task<TModel> FindOneAsync<TModel>(Expression<Func<TModel, bool>> predicate) where TModel : class
{
var foundEntity = await Get<TModel>().FirstOrDefaultAsync(predicate);
if (foundEntity == null)
{
throw new NotFoundException();
}
return foundEntity;
}
然后最终这样称呼它:
return await Db.FindOneAsync<Node>(node => node.Type == NodeType.Start);
但是似乎mongo驱动程序中的enum转换器有错误。我收到以下错误:
应用程序启动异常:System.AggregateException:一个或多个
发生错误。 (不支持转换({document} .Type,Int32)。)
---> System.InvalidOperationException:不支持Convert({document} .Type,Int32)。
不知道我在做什么错。如果我首先将可查询对象转换为列表,则一切正常!但是随后,筛选操作在ram上运行。
参考方案
似乎无法重现该错误。以下是使用最新驱动程序的信息。您的驱动程序和服务器版本是什么?
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using System;
using System.Linq.Expressions;
using System.Threading.Tasks;
namespace StackOverflow
{
public class Program
{
public enum NodeType
{
Start = 1,
End = 2
}
public class Node
{
public ObjectId Id { get; set; }
public NodeType Type { get; set; }
}
private async static Task Main(string[] args)
{
var _database = new MongoClient("mongodb://localhost").GetDatabase("test");
await GetCollection<Node>().InsertOneAsync(new Node { Type = NodeType.Start });
IMongoCollection<T> GetCollection<T>() where T : class
{
return _database.GetCollection<T>(typeof(T).Name);
}
IMongoQueryable<TModel> Get<TModel>() where TModel : class
{
return GetCollection<TModel>().AsQueryable();
}
async Task<TModel> FindOneAsync<TModel>(Expression<Func<TModel, bool>> predicate) where TModel : class
{
var foundEntity = await Get<TModel>().FirstOrDefaultAsync(predicate);
if (foundEntity == null)
{
throw new Exception("not found");
}
return foundEntity;
}
var res = await FindOneAsync<Node>(node => node.Type == NodeType.Start);
}
}
}
将谓词<T>转换为Func <T,bool> - c#我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…
合并List <T>和List <Optional <T >> - java鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…
无法从ArrayList <String>转换为List <Comparable> - java当我写下面的代码时,编译器说 无法从ArrayList<String>转换为List<Comparable>private List<Comparable> get(){ return new ArrayList<String>(); } 但是当我用通配符编写返回类型时,代码会编译。private List&l…
OpenShift构建错误:无法在多模块Maven Spring启动项目的父模块中导入子模块类 - java我有一个使用spring的多模块Maven项目。通用模块类用作业务模块项目中的直接导入。我可以在本地PC上编译并成功运行它们。当我在OpenShift中部署相同的模块时,出现错误,无法在业务模块中导入通用模块类。项目结构可以总结如下:项目根 通用模块 src pom.xml 业务模块 src pom.xml pom.xml父POM:<?xml vers…
List <Dog>是List <Animal>的子类吗?为什么Java泛型不是隐式多态的? - java我对Java泛型如何处理继承/多态感到困惑。假设以下层次结构-动物(父母)狗-猫(儿童)因此,假设我有一个方法doSomething(List<Animal> animals)。根据继承和多态性的所有规则,我假设List<Dog>是List<Animal>,而List<Cat>是List<Animal&g…