无法通过IMongoQueryable mongodb c#驱动程序linq语句从GroupBy中的组获取 组项目

问题描述 投票:1回答:1

当我尝试这个时:

var groupedItems = _collection
    .AsQueryable()
    .GroupBy(pv => pv.ArticleNumber, (k, s) => new { k, Items = s })
    .Select(group => group.Items)
    .ToList();

我收到以下异常:

    System.ArgumentException: Value type of serializer is ProductVersion[] and does not match member type System.Collections.Generic.IEnumerable`1[[ProductVersion, ProductService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. (Parameter 'serializer')
   at MongoDB.Bson.Serialization.BsonMemberMap.SetSerializer(IBsonSerializer serializer)...

ProductVersion是集合的基础类型。

[当我先通过AsEnumerable()将集合加载到内存中,然后应用GroupBy和其他操作时,它起作用,但这在我的方案中不是一个选择。我有没有机会在IMongoQueryable上的linq语句中获得组项目?

我正在使用MongoDB.Driver 2.10.2。

c# mongodb linq mongodb-.net-driver mongodb-csharp-2.0
1个回答
0
投票

LINQ提供程序仅提供分组键和累加器(docs,但是MongoDB的Aggregation Framework支持您要实现的目标,因此您只需要以更接近MongoDB语法的方式编写查询即可。

尝试:

public class GroupedArticles
{
    public int Id { get; set; }
    public Article[] Articles { get; set; }
}

var grouped = _collection.Aggregate().Group<GroupedArticles>(new BsonDocument()
        {
            {"_id", "$ArticleNumber"},
            {"Articles", new BsonDocument() {{"$push", "$$ROOT"}}}
        })
        .ToList() // hits the database
        .Select(art => art.Articles) //projects your results in-memory
        .ToList();

这将被翻译为$group,因此大部分将在数据库中执行。

© www.soinside.com 2019 - 2024. All rights reserved.