2015-05-09 17 views
-3

如何使用selectfieldString和resultFieldString編寫動態groupby? 樣本:C#linq group按字段和結果字符串?

 public class Customer 
    { 
     public int Id; 
     public string Name; 
     public string LastName; 
     public decimal Amount; 
    } 
var lst = new List<Customer>(); 
     lst.Add(new Customer { Id = 1, Name = "vahid", LastName = "Aghilpour", Amount = 15 }); 
     lst.Add(new Customer { Id = 1, Name = "hamid", LastName = "rezaei", Amount = 35 }); 
     lst.Add(new Customer { Id = 1, Name = "vahid", LastName = "Aghilpour", Amount = 15 }); 


     string[] field = { "Name", "LastName" }; 
     string aggrigatefield = "Sum(Amount)"; 

     lst.GroupBy(field).Select(aggrigatefield);---?????????? 
+1

你的問題是相當含糊。沒有上下文,我不明白你想達到什麼。請使用更多代碼編輯您的問題,並嘗試解釋您要實現的目標。 –

+0

如何獲得關鍵與選擇字段到多列---新(總和(金額)作爲SumAmount,總和(Id)作爲SumId,關鍵)給項目鍵,但我是新的(總和(金額)爲SumAmount,Sum(Id )作爲SumId,Name,LastName) – VahidAghilpour

回答

1

使用dynamic linq你應該能夠做到這一點。

// Remember: using System.Linq.Dynamic; 
// The format for the key of the GroupBy is "new(field1,field2)" 
// "it" as elementSelector means "the full object" 
string field = string.Format("new({0})", string.Join(",", fields)); 
decimal[] res = lst.GroupBy(field, "it") 
        .Select(aggrigatefield) 
        .Cast<decimal>() 
        .ToArray(); 

注意,如果Select完全是動態的(所以它可以返回Sum()string場,或decimal場,或一個複雜的對象或580),那麼你就無法真正做一個Cast<decimal>(),因爲你「靜態」不知道返回的對象的類型。你所要做的

object[] res = lst.GroupBy(field, "it") 
        .Select(aggrigatefield) 
        .Cast<object>() 
        .ToArray(); 

dynamic[] res = lst.GroupBy(field, "it") 
        .Select(aggrigatefield) 
        .Cast<dynamic>() 
        .ToArray();