当我尝试这个时:
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。
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
,因此大部分将在数据库中执行。