C#Mongo-通过枚举的Linq过滤器->转换异常 - c#

我尝试像这样过滤我的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…