在MongoDB上的Group Aggregate中动态添加Match运算符

时间:2017-11-30 14:05:36

标签: c# mongodb

我在我的网络应用程序中使用MongoDB C# driver 2.4.4。我需要将文档分组到一个动态过滤它们的集合中。

 var query = collection.Aggregate()
                .Match(y => y.IdLower.Contains(id))
                .Match(y => y.NameLower.Contains(name))
                .Group(
                key => key.Id,
                g => new 
                {
                    Id = g.Key
                }).ToList(); 

我需要根据用户输入添加或删除Match运算符,但我无法确定如何。

我试过这样的事情:

 var query = collection.Aggregate();

    if(!string.IsNullOrWhiteSpace(id))
         query = query.Match(y => y.IdLower.Contains(id));

    if (!string.IsNullOrWhiteSpace(name))
        query = query.Match(y => y.NameLower.Contains(name));

    query =  query.Group(
        key => key.Id,
        g => new 
        {
            Id = g.Key
        }).ToList(); 

但我收到语法错误Cannot imlicitly convert type System.Collection.Generic.List<<anonymous type: string Id>> to '...

如何实现这样的目标?

1 个答案:

答案 0 :(得分:0)

问题是query的类型是IAggregateFluent<T1>(其中T1是您的文档类型),但.Group()方法的返回类型是{{1 (IAggregateFluent<T2>是匿名类型)。编译器不知道如何隐式转换这些类型,因此错误。

这取决于您在此处尝试做什么,但解决此问题的一种可能方法是从组表达式返回T2(您的文档类型)的实例:

T1

另一种选择是将query = query.Group( key => key.Id, g => new T1 // replace "T1" with the actual name of your class { Id = g.Key }).ToList(); 函数的结果分配给一个新变量:

group

希望这有帮助。