C# 使用LINQ聚合对象列表中的列表

C# 使用LINQ聚合对象列表中的列表,c#,mongodb,linq,C#,Mongodb,Linq,作为后续工作,我需要在MongoDB中聚合内部数组,我正在尝试在LINQ中完成相同的任务 我很接近,因为我已经了解了如何对单个项目进行聚合: // Get collection var collection = _database.GetCollection<VehicleDataUpload>("Vehicles"); // Get first project that meets our identifier var firstProject = collection.AsQu

作为后续工作,我需要在MongoDB中聚合内部数组,我正在尝试在LINQ中完成相同的任务

我很接近,因为我已经了解了如何对单个项目进行聚合:

// Get collection
var collection = _database.GetCollection<VehicleDataUpload>("Vehicles");

// Get first project that meets our identifier
var firstProject = collection.AsQueryable().Where(i => i.ProjectId.Equals("1234")).First();

// Get a list of DailySummaryData objects 
var aggregation = 
    from entry in firstProject.VehicleEntries
    group entry by entry.Data
    into result
    select new DailySummaryData() {
        ProjectName = firstProject.ProjectId,
        Date = result.FirstOrDefault().Date,
        Passed = result.Sum(x => (x.VehicleStatus.Equals("PASSED") ? 1 : 0)),
        Failed = result.Sum(x => (x.VehicleStatus.Equals("FAILED") ? 1 : 0))
    };

return aggregation.ToList();
//获取集合
var collection=_database.GetCollection(“车辆”);
//获取第一个符合我们的标识符的项目
var firstProject=collection.AsQueryable()。其中(i=>i.ProjectId.Equals(“1234”)).First();
//获取DailySummaryData对象的列表
变量聚合=
从firstProject.VehicleEntries中的条目开始
按条目分组。数据
结果
选择新的DailySummaryData(){
ProjectName=firstProject.ProjectId,
日期=result.FirstOrDefault().Date,
通过=结果.Sum(x=>(x.VehicleStatus.Equals(“通过”)?1:0)),
失败=结果和(x=>(x.VehicleStatus.Equals(“失败”)?1:0)
};
返回aggregation.ToList();

但是,我不能对集合使用
…First()
,因为一个项目可能有多个VehicleData上载。如何汇总返回的文档列表中的所有列表?

请尝试以下操作:

// Get collection
var collection = _database.GetCollection<VehicleDataUpload>("Vehicles");

// Get first project that meets our identifier
var aggregation = collection
    .AsQueryable()
    // This will return an IEnumerable of Vehicles object
    .Where(i => i.ProjectId.Equals("1234"))
    // Assuming you want to return a plain list, you should use SelectMany
    .SelectMany(v => v.VehicleEntries
        // You group each list of VehicleEntries
        .GroupBy(ve => ve.Data)
        // For each group you return a new DailySummaryData object
        .Select(g => new DailySummaryData() {
            ProjectName = v.ProjectId,
            Date = g.Key,
            Passed = g.Sum(x => (x.VehicleStatus.Equals("PASSED") ? 1 : 0)),
            Failed = g.Sum(x => (x.VehicleStatus.Equals("FAILED") ? 1 : 0))
        })

return aggregation.ToList();
//获取集合
var collection=_database.GetCollection(“车辆”);
//获取第一个符合我们的标识符的项目
变量聚合=集合
.AsQueryable()
//这将返回IEnumerable of Vehicles对象
其中(i=>i.ProjectId.Equals(“1234”))
//假设您想要返回一个简单的列表,您应该使用SelectMany
.选择多个(v=>v.车辆入口)
//您可以将每个车辆入口列表分组
.GroupBy(ve=>ve.Data)
//对于每个组,返回一个新的DailySummaryData对象
.Select(g=>newdailysummarydata(){
ProjectName=v.ProjectId,
日期=g.键,
通过=g.Sum(x=>(x.VehicleStatus.Equals(“通过”)?1:0)),
Failed=g.Sum(x=>(x.VehicleStatus.Equals(“Failed”)?1:0)
})
返回aggregation.ToList();

问题出在哪里?您不想按单个项目Id进行筛选,但对所有项目都有相同的结果?对吗?关闭!我需要按项目Id进行筛选,但这可能会返回多个文档。因此,当我调用
var firstProject=collection.AsQueryable()。其中(I=>I.ProjectId.Equals(“1234”)。First()
我希望能够说
var uploads=collection.AsQueryable().Where(I=>I.ProjectId.Equals(“1234”)).ToList()
然后对
uploads
中的每个元素执行与上面相同的聚合。这更清楚吗?您是否尝试过删除
。First()?
Wow,谢谢!唯一的问题是我不能做
ProjectName=v.projectd
我相信因为v现在超出了范围。我尝试使用输入字符串手动设置它:
ProjectName=argumentPassedToMethod
,但这给了我一个MongoCommandException,表示聚合字段不是以$开头的。我将接受它不管怎样,因为它做了我想做的事情。我只需要找到正确的方法把项目名添加到结果项中。.ProjectId.Hmm这不起作用,因为每个VehicleEntry都没有项目Id。我会将管道分解为多个步骤,并尝试找出答案,让您不断更新。