2014-02-06 34 views
0

我想創建一種方式來運行在數據表中的一些動態LINQ,我已經粘貼代碼測試代碼不是我的,我的工作就全碼,但我認爲這是不夠以瞭解我正在嘗試做的事情。添加委託表達式作爲參數

基本上我想的第二參數添加到將包含可被用於替代R => r.Field(「場」)的表達的方法。

public string GetStringValueFromData(DataTable data) 
{ 
    switch (this.MethodType) 
    { 
     case (LabelMethodType.Count): 
      return data.AsEnumerable().Select(r => r.Field<string>("sometextfield")).Count().ToString(); 
     case (LabelMethodType.Sum): 
      return data.AsEnumerable().Sum(r => r.Field<decimal>("somenumberfield")).ToString(); 
     case (LabelMethodType.Average): 
      return data.AsEnumerable().Average(r => r.Field<decimal>("anotherfield")).ToString(); 
    } 

    return string.Empty; 
} 

所以基本上這個方法看起來像這樣。但我當然已經嘗試過,甚至沒有編譯。

public string GetStringValueFromData(DataTable data, Expression<Func<DataRow, object>> expression) 
{ 
    switch (this.MethodType) 
    { 
     case (LabelMethodType.Count): 
      return data.AsEnumerable().Select(expression).Count().ToString(); 
     case (LabelMethodType.Sum): 
      return data.AsEnumerable().Sum(expression).ToString(); 
     case (LabelMethodType.Average): 
      return data.AsEnumerable().Average(expression).ToString(); 
    } 

    return string.Empty; 
} 

有誰可能知道什麼類型的可以使參數這個工作,這樣它將接受像R => r.Field(「sometextfield」)或R => r.Field(「somenumberfield 「)或者有其他方法的建議。

感謝

CD

+2

嗯,首先,因爲你正在處理LINQ到對象,而不是'IQueryable',所以你只需要傳遞一個'Func',而不是'Expression '。然而,這不是你需要做的唯一改變。 – Servy

回答

0

這應該按預期工作:

public string GetStringValueFromData(DataTable data, Func<DataRow, object> expression) 
{ 
    switch (this.MethodType) 
    { 
     case (LabelMethodType.Count): 
      return data.AsEnumerable().Select(expression).Count().ToString(); 
     case (LabelMethodType.Sum): 
      return data.AsEnumerable().Select(expression).Cast<int>().Sum().ToString(); 
     case (LabelMethodType.Average): 
      return data.AsEnumerable().Select(expression).Cast<int>().Average().ToString(); 
    } 

    return string.Empty; 
} 

注:

您不需要使用Expression < Func鍵<>>,你可以使用只是功能<>。

選擇表達了計數情況下是沒有必要的,投影絕不會影響計數。

+0

是啊,似乎工作,我已經脫掉表情部位,轉身只是一個Func鍵<>基於什麼Servy建議,只是我現在需要理清的問題是選擇正確的演員<>但這讓我過去主要障礙,感謝您的幫助。 –

+0

投影並不總是投射到整數。他們沒有推測出任何常數的數字類型,所以這個解決方案不會做它所要求的。 – Servy