var result = await Events.AsQueryable()
.Where(_ => _.Date >= from.Date && _.Date <= to.Date)
.GroupBy(_ => _.SomeProp)
.Select(n => new { n.Key, Count = n.Count() })
.ToListAsync();
就像魅力一样。但是,我想说我想通过自定义字段聚合 - 在aggregateBy字符串参数中收到。 所以我试试:
var propertyToGroupBy = typeof(DiagnosticEvent).GetProperties()
.First(x => x.Name.ToLowerInvariant() == aggregateBy);
然后:
var result = await Events.AsQueryable()
.Where(_ => _.Date >= from.Date && _.Date <= to.Date)
.GroupBy(p => propertyToGroupBy.GetValue(p))
.Select(n => new { n.Key, Count = n.Count() })
.ToListAsync();
最终:
不支持System.Reflection.PropertyInfo类型的GetValue 表达式树System.String Type.GetValue({document})
在坚持使用LINQ的时候知道如何做到这一点? 我知道我可以使用Fluent API:
var group = new BsonDocument { { "_id", $"${aggregateBy}"}, { "Count", new BsonDocument("$sum", 1) } };
但我希望与LINQ方法保持一致。