如果有行,使用LINQ从列名中获取列值?

时间:2008-11-20 14:42:56

标签: linq dataset

我正在尝试将一些使用数据集的代码转换为LINQ。一些代码将列名称作为字符串传递给其他函数。

无论如何我可以轻松地将其重写为LINQ吗?

string s = getElement(tr, elementName);

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

或者:

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

回答GVS: 转换为LINQ的原因是因为它在许多情况下更容易编写LINQ代码并获得更好的性能。它与stackoverflow上的另一个问题有关: programming pattern using typed datasets

我需要将列名用作字符串的原因主要是因为列名作为输入字段的ID传递,然后使用AJAX(jquery)将它们发送回程序。

3 个答案:

答案 0 :(得分:2)

  1. 简单方法

    1.1。 使用IEnumerable (Linq to Objects或类似) 更改Func的elementName参数并改为传递lambdas(您也​​将获得编译时检查!)

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

  2. 复杂方式: 如果由于某种原因,您需要将参数保留为字符串(可能由用户引入)您可以使用反射在运行时http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx构建表达式树。

    2.1。 使用IEnumerable 然后编译,并将其用作where中的参数,选择...

    2.2。 使用IQueryable 将其用作where,select,

  3. 中的参数

    如果你需要用其他lambda组成lambda,请使用这种很酷的技巧http://tomasp.net/blog/linq-expand.aspx

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

答案 2 :(得分:-1)

为什么要使用LINQ将工作和清除代码转换为某些内容?

编辑:LINQ很好,很酷。但是,不要像许多XML粉丝那样做出同样的错误(特别是第一个适配器),将其应用于所有内容。