我正在尝试将一些使用数据集的代码转换为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)将它们发送回程序。
答案 0 :(得分:2)
简单方法
1.1。 使用IEnumerable (Linq to Objects或类似) 更改Func的elementName参数并改为传递lambdas(您也将获得编译时检查!)
1.2。 使用IQueryable (Linq to SQL或类似) 相同,但使用Expression>代替。
复杂方式: 如果由于某种原因,您需要将参数保留为字符串(可能由用户引入)您可以使用反射在运行时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
答案 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粉丝那样做出同样的错误(特别是第一个适配器),将其应用于所有内容。