0

我正在尝试将一些使用数据集的代码转换为 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上的另一个问题有关: 使用类型化数据集的编程模式

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

4

3 回答 3

2
  1. 简单的方法

    1.1。使用 IEnumerable(Linq to Objects 或类似)更改 Func 的 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然后编译,并将其用作 where 中的参数,选择...

    2.2. 使用 IQueryable将其用作 where、select、

如果您需要将 lambda 与其他 lambda 组合使用这个很酷的技术http://tomasp.net/blog/linq-expand.aspx

于 2008-11-20T15:06:52.767 回答
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);
}
于 2009-04-27T11:47:36.280 回答
-1

为什么要使用 LINQ 将工作和清晰的代码转换成某种东西?

编辑:LINQ 很好,很酷。但是不要像许多 XML 爱好者(特别是第一适配器)那样犯同样的错误,把它应用到所有东西上。

于 2008-11-20T15:06:32.237 回答