2010-03-02 36 views
0

我有一個這樣的表在我的LINQ to SQL類:如何通過索引來訪問列在LINQ

ID CL1 CL2 CL3 ... CL20 
-- ---- ---- ----- ------ 
1  12  35  54 .... 44 
2  11  35  78 ..... 75 

數據是不是在這個例子中很重要的。
我需要訪問每列與他們的索引。

例如在CL3這樣達到的數據:

var x = db.myTable.single(a=>a.ID==1)[3]; 

誰能幫助我嗎?

+0

看起來你可能有一個規範化問題。也許列應該是行? – 2010-03-02 09:27:00

+0

它是我應該努力的一個數據庫。不幸的是我沒有**設計**它! – LIX 2010-03-02 10:31:53

回答

0

則可以將結果轉換到DataTable這樣

public static DataTable ConvertToDataTable<T>(IList<T> list) 
{ 
    var dt = new DataTable(); 
    var properties = typeof(T).GetProperties(); 

    foreach (var pi in properties) 
     dt.Columns.Add(pi.Name, pi.PropertyType); 

    foreach (T element in list) { 
     var row = dt.NewRow(); 
     foreach (var pi in properties) 
      row[pi.Name] = pi.GetValue(element, null); 
     dt.Rows.Add(row); 
    } 
    return dt; 
} 

,然後你可以通過名稱或索引來訪問列。

var dt = ConvertToDataTable<test>(list); 
var CL5 = dt.Rows[0][5]; 
var CL5_by_name = dt.Rows[1]["CL5"]; 
+0

我試過這個,它的工作 – LIX 2010-03-13 08:41:47

1

對象中的屬性不一定與列在數據庫中的順序相同。

你可以通過索引來做反射來選擇一個屬性,但這是沒有意義的。您應該使用列的名稱。

根據你的評論,這裏的列名稱以數字結尾,這是你可以做的。

int columnIndex = 3; 
var property = (from p in db.myTable.GetType().GetProperties() 
       where p.Name.EndsWith(columnIndex.ToString()) 
       select p).First(); 
var record = db.myTable.single(a=>a.ID==1); 
var x = property.GetValue(record, null) 
+0

所有列都具有相同的文本格式。他們從CL開始,只有第三個字符被改變。例如CL1,CL2,CL3,CL4,CL5。它可以幫助嗎? – LIX 2010-03-02 09:10:47

+0

我試過這個,但它引發了一個異常:Sequence包含沒有匹配的元素。 – LIX 2010-03-02 10:27:22

+0

從現在開始,所有剩下的工作就是運用你的常識,如何將這個解決方案應用於你的問題。 – 2010-03-02 11:18:10