当你有行时,使用LINQ从列名获取列值?

问题描述:

我试图将一些使用数据集的代码转换为LINQ。一些代码将字段名称作为字符串传递给其他函数。当你有行时,使用LINQ从列名获取列值?

是否有反正我可以很容易地重写成LINQ?

string s = getElement(tr, elementName); 

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

OR:

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

答到GVS: 转换为LINQ的原因是因为它在很多情况下更容易编写LINQ和获得更好的性能。它在这里涉及到另一个问题上的计算器: programming pattern using typed datasets

我之所以需要使用列名作为字符串,主要是因为列名作为输入字段ID过去了,他们再送回程序使用AJAX(jQuery)。

答案是使用反射来组成拉姆达。

获得一个价值

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); 
} 

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

编辑:LINQ很好,很酷的东西。但是,不要像许多XML粉丝所做的那样(特别是第一个适配器)将相同的错误应用到一切中。

+0

不过我不认为LINQ语法将是清晰和简单,因为你给现在的代码示例。 – GvS 2008-11-21 14:48:09

  1. 简单的方式

    1.1。 使用的IEnumerable(LINQ到对象或类似) 更改函数求的的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然后编译,并用它作为参数在哪里,选择...

    2.2。 使用IQueryable的使用它作为在哪里,选择一个参数,

如果你需要与其他lambda表达式使用此凉技术http://tomasp.net/blog/linq-expand.aspx

+0

我觉得2.2。使用IQueryable将它用作where,select中的参数,听起来非常好。你有可能给我一个例子吗?我对LINQ atm很陌生。 – devzero 2008-11-21 08:49:11