2016-01-13 98 views
1

作爲後續到this question,我需要在MongoDB中聚合內部數組,我試圖在LINQ中完成相同的任務。使用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(); 

但是,我不能收集使用...First(),因爲有可能是一個項目中多個VehicleDataUploads。如何彙總返回的文檔列表中的所有列表?

+0

有什麼問題嗎?你不想過濾一個Project ID,但是對於所有的項目都有相同的結果?正確? – user449689

+0

關閉!我需要按項目ID過濾,但可能會返回多個文檔。所以當我調用'var firstProject = collection.AsQueryable()。Where(i => i.ProjectId.Equals(「1234」))。First();'我寧願能說'var uploads = collection.AsQueryable ().Where(i => i.ProjectId.Equals(「1234」))。ToList()'然後執行與上面相同的聚合,但對於'uploads'中的*每個元素*。這更清楚嗎? – AdamMc331

+0

你試過刪除'.First()?' –

回答

1

試試如下:

// 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(); 
+0

哇,謝謝! * only *問題是我不能'ProjectName = v.ProjectId'我相信因爲v現在已經超出了範圍。我嘗試使用輸入字符串手動設置它:'ProjectName = argumentPassedToMethod',但是這給了我一個MongoCommandException,說聚合字段不以$開頭。 – AdamMc331

+0

無論如何,我會接受這一點,因爲它做了我想要的。我只需要找到將項目名稱添加到結果項目的正確方法。 – AdamMc331

+0

考慮到你的組中有任何對象的信息,所以你可以嘗試類似g.First()。ProjectId。 – user449689