如何在LINQ中按索引访问列

时间:2010-03-02 08:55:56

标签: c# linq-to-sql

我的Linq to sql类中有一个这样的表:

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]; 

有人可以帮我吗?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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"];