LINQ在MongoDB C#驱动程序2.1中选择GroupBy

时间:2015-11-25 14:29:34

标签: mongodb linq mongodb-.net-driver

我使用运行Mongo 3.0的2.1 C#驱动程序在Mongo上遇到以下LINQ表达式问题。选择Id工作正常但不选择A.

以下简单测试演示了我遇到的错误。

  

不支持指定的方法。   在MongoDB.Driver.Linq.Processors.AccumulatorBinder.GetAccumulatorArgument(表达式节点)

如果不支持,任何建议如何解决它而不必先解开可查询?我知道我可以使用mongo聚合框架,但这不是所希望的,因为我们没有在这里暴露,我不希望在这个级别使用mongo特定的语法。

[Test]
    public void TestLinqSelectOnGroupBy()
    {
        MongoClient mongoClient = new MongoClient();
        var repo = mongoClient.GetDatabase("GroupSelect");

        var a = new A() { Id = "1", Group = "A" };
        var col = repo.GetCollection<A>("A");
        col.InsertOneAsync(a);
        var allA = col.AsQueryable(); // adding .ToArray(); will obviously make it work but that is not very efficient

        var works =  allA.GroupBy(x => x.Group).Select(x => x.First().Id).ToArray();
        var fails =  allA.GroupBy(x => x.Group).Select(x => x.First()).ToArray();
    }

    private class A 
    {
        public string Id { get; set; }
        public string Group { get; set; }
    }

1 个答案:

答案 0 :(得分:2)

我从另一个Stack Overflow问题中偶然发现了an answer。问题是First()调用本身。

从该答案中引用octavioccl:

 var statusesCollection = database.GetCollection<Status>("statuses");
 var result= statusesCollection.AsQueryable()
                               .OrderByDescending(e=>e.date)
                               .GroupBy(e=>e.payment)
                               .Select(g=>new Status{_id =g.First()._id,
                                                     payment = g.Key,
                                                     code=g.First().code,
                                                     date=g.First().date
                                                    }
                                       )
                               .ToList();
     

现在您可能想知道为什么我必须将结果投影到Status类的新实例,如果我能从每个组中获得相同的结果调用First扩展方法?不幸的是,这还不支持。其中一个原因是因为Linq提供程序在构建聚合管道时使用[$ first] [1]操作,这就是$first操作的工作原理。

因此,对于您的情况,您应该能够做到:

allA.GroupBy(x => x.Group).Select(x => new A 
{ 
    Id = x.First().Id, 
    Group = x.First().Group 
}).ToArray();

我只是在找到你的问题的同时仍然看到这个特殊的东西是否还是一个问题而且它似乎仍然有点不幸。