2008-11-20 91 views
0

我試圖將一些使用數據集的代碼轉換爲LINQ。一些代碼將字段名稱作爲字符串傳遞給其他函數。當你有行時,使用LINQ從列名獲取列值?

是否有反正我可以很容易地重寫成LINQ?

string s = getElement(tr, elementName); 

private string getElement (tableRow re, string elementName){ 
    if(tr[elementName] != null){ 
     return tr[elementName].toString() 
    } 
} 

OR:

private void copy (tableRow trFrom, tableRow trTo){ 
    foreach (DataColumn c in trFrom.Table.Columns) { 
     trTo[c.ColumnName] = trFrom[c.ColumnName]; 
    } 
} 

答到GVS: 轉換爲LINQ的原因是因爲它在很多情況下更容易編寫LINQ和獲得更好的性能。它在這裏涉及到另一個問題上的計算器: programming pattern using typed datasets

我之所以需要使用列名作爲字符串,主要是因爲列名作爲輸入字段ID過去了,他們再送回程序使用AJAX(jQuery)。

回答

1

答案是使用反射來組成拉姆達。

獲得一個價值

private string getElement (tableRow tr, string element){ 
    string val = ""; 
    try 
    { 
     val = tr.GetType().GetProperty(element).GetValue(tr, null).ToString(); 
    } 
    catch //NULL value 
    { 
     val = ""; 
    } 
} 

或者副本場景:

foreach (PropertyInfo c in tr.GetType().GetProperties()) 
{ 
    thr.GetType().GetProperty(c.Name).SetValue(thr, 
     tr.GetType().GetProperty(c.Name).GetValue(tr, null), null); 
} 
-1

爲什麼要將工作和清晰的代碼轉換爲使用LINQ的東西?

編輯:LINQ很好,很酷的東西。但是,不要像許多XML粉絲所做的那樣(特別是第一個適配器)將相同的錯誤應用到一切中。

+0

不過我不認爲LINQ語法將是清晰和簡單,因爲你給現在的代碼示例。 – GvS 2008-11-21 14:48:09

2
  1. 簡單的方式

    1.1。 使用的IEnumerable(LINQ到對象或類似) 更改函數求的的ElementName參數和lambda表達式票代替。(你會得到編譯時檢查,以及!)

    1.2。 使用IQueryable(Linq to SQL或類似) 相同,但使用Expression>代替。

  2. 複雜的方式: 如果由於某種原因,你需要保持參數作爲字符串(也許是由用戶引入)可以使用反射在運行時http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx構建表達式樹。

    2.1。 使用IEnumerable然後編譯,並用它作爲參數在哪裏,選擇...

    2.2。 使用IQueryable的使用它作爲在哪裏,選擇一個參數,

如果你需要與其他lambda表達式使用此涼技術http://tomasp.net/blog/linq-expand.aspx

+0

我覺得2.2。使用IQueryable將它用作where,select中的參數,聽起來非常好。你有可能給我一個例子嗎?我對LINQ atm很陌生。 – devzero 2008-11-21 08:49:11