2012-11-25 29 views
0

我想要使用Linq動態選擇DataTable列由ColumnName,但要使用字段<>我必須明確地轉換它們或將所有對象,方塊效率不高。反向typeof使用Linq字段<T>

我想:

string[] colsNames = new[] { "Colum1", "Colum2" }; 
DataTable dt = StoredProcedure().Tables[0]; 

var cols = dt.Columns.Cast<DataColumn>().Where(c => cols.Contains(c.ColumnName)); 

if (cols.Any()) 
{ 
    dt.AsEnumerable().Select(r => string.Join(":", cols.Select(c => r.Field<c.DataType>(c.ColumnName)))) 
} 

但是,這將引發我一個錯誤The type or namespace name 'c' could not be found

如何轉換typeof(decimal)Field<decimal>("Column1")例如?

+1

有什麼意義?如果你不知道請求數據的類型,那麼你可以處理的只是一個'object' –

+0

我知道請求數據的類型 – happygilmore

+0

但是你說你正在按列名檢索數據。然後,IEnumerable出了什麼問題 requestedData = dt.AsEnumerable()。Select(r => r.Field (「ColumnName」))'? –

回答

0

試試這個:

DataTable dt = new DataTable(); 
dt.Columns.Add("id", Type.GetType("System.Int32")); 
dt.Columns.Add("Colum1", Type.GetType("System.Int32")); 
dt.Columns.Add("Colum2", Type.GetType("System.String")); 
dt.Columns.Add("Colum3"); 

string[] colsNames = new[] { "Colum1", "Colum2" }; 
var colTypes = dt.Columns.Cast<DataColumn>() 
       .Where(c => colsNames.Contains(c.ColumnName)) 
       .Select(c => new 
       { 
        c.ColumnName, 
        c.DataType 
       }) 
       .ToDictionary(key => key.ColumnName, val => val.DataType); 

var query = dt.AsEnumerable() 
       .Where(row => (int)row["id"]==5) 
       .Select(row => new 
       { 
        Colum1 = Convert.ChangeType(row[colsNames[0]], colTypes[colsNames[0]]), 
        Colum2 = Convert.ChangeType(row[colsNames[1]], colTypes[colsNames[1]]) 
       }); 

這裏是另一種變體,但它是不是很有趣:

//define class 
public class myClass 
{ 
    public int Column1; 
    public string Column2; 
} 
// then 
var query = dt.AsEnumerable() 
       .Select(row => new myClass 
       { 
        Column1 = Convert.ToInt32(row[colsNames[0]]), 
        Column2 = row[colsNames[1]].ToString() 
       }); 

有第三方案:可以在數據庫中創建一個視圖或存儲過程並將其添加到數據上下文中

+0

不能+1。沒有足夠的學分。對於ChangeType爲+1。我會盡力在我的解決方案中實現它。 – happygilmore

+0

好的,放置+以後,雖然不一定:) :) –

+0

只需輸入'Colum1 = row [0]'就足夠了。 –