2017-02-28 50 views
0

我有一個對象objA的IQueriable<EntityA>類型,我想在C#中使用lambda表示法進行查詢,按兩個參數(Status和WeekOfYear)進行分組,並計數objA中每個EntityA類型實體的出現。我想結果集計數爲0.由兩個參數分組和計數在linq中,考慮發生0

IQueriable<EntityA> objA= ... 

var group = objA.GroupBy(a => new { a.Status, a.WeekOfYear }) 
       .Select(a => new { a.Key.Status, a.Key.Week, Count = a.Count() }); 

上面的代碼是最接近我從我想要的。它返回IQueriable<int, int, int>,我可以很容易地插入到我的Excel表格中。但是當計數爲0時,我沒有在結果集中看到一個入口,然後填寫Excel工作表變得非常棘手。是否有可能獲得我需要的結果,還是我真的必須檢查所有對(如此不雅!!!)?

+2

得到了工作演示如果你有*狀態X WEEKOFYEAR的所有組合*?通常情況下,您會將它們加入到您的數據中,然後以某種方式計算... – xanatos

回答

0

如果您使用Distinct()函數,則可以獲取所有狀態和所有WeekOfYear並檢查每個元組的計數。

代碼是這樣的,你可以在fiddle

using System; 
using System.Linq; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     IQueryable<Entity> data = (new List<Entity>() { 
      new Entity { Status = "1", Week = "a"}, 
       new Entity { Status = "2", Week = "c"}, 
       new Entity { Status = "3", Week = "b"}, 
       new Entity { Status = "1", Week = "a"}, 
       new Entity { Status = "1", Week = "a"} 
     }) .AsQueryable();; 



     var result = new List<EntityResult>(); 

     var statuses = data.Select(a => a.Status).Distinct().ToList(); 
     var weeks = data.Select(a => a.Week).Distinct().ToList(); 

     statuses.ForEach(s => { 
      weeks.ForEach(w => { 
       int count = data.Where(a => a.Status == s && a.Week == w).Count(); 

       result.Add(new EntityResult { Status = s, Week = s, Count= count}); 
      }); 
     }); 


     Console.WriteLine(result[0].Count); 
    } 



} 

public class Entity 
{ 
    public string Status; 

    public string Week; 
} 

public class EntityResult 
{ 

    public string Status; 

    public string Week; 

    public int Count; 
} 
+0

如果不是所有狀態/周組合都存在於數據中,該怎麼辦? –

+0

它會插入一個計數爲0的記錄 – Ygalbel

+0

不,我的意思是,假設有一個條目「Status =」5「,Week =」a「'。狀態「4」不會插入計數0。這就是我所瞭解的OP試圖達到的目標。 –