当你有行时,使用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粉丝所做的那样(特别是第一个适配器)将相同的错误应用到一切中。
-
简单的方式
1.1。 使用的IEnumerable(LINQ到对象或类似) 更改函数求的的ElementName参数和lambda表达式票代替。(你会得到编译时检查,以及!)
1.2。 使用IQueryable(Linq to SQL或类似) 相同,但使用Expression>代替。
-
复杂的方式: 如果由于某种原因,你需要保持参数作为字符串(也许是由用户引入)可以使用反射在运行时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
我觉得2.2。使用IQueryable将它用作where,select中的参数,听起来非常好。你有可能给我一个例子吗?我对LINQ atm很陌生。 – devzero 2008-11-21 08:49:11
不过我不认为LINQ语法将是清晰和简单,因为你给现在的代码示例。 – GvS 2008-11-21 14:48:09