2017-02-22 34 views
0

我正在尝试为DataTable创建一个动态查找过滤器。表达式调用类型组合lambda linq,其中

该代码看起来像这样,我正在循环每个行/列。 (一个工作台进给另外一个)

DataRow FoundRow=null; 
      foreach (string ID in IDToCheck) 
     { 
         FoundRow = IdTable.AsEnumerable().Where(row => row.Field<string>(ID).Equals(
          RowInfo[ID].ToString(),StringComparison.InvariantCultureIgnoreCase)).First(); 
DoStuffWith(FoundRow); 
     } 

我不管理转换的row.Field<string>(ID)Expression.Call

我想重现Microsoft的示例。

+0

你为什么要这么做?你有什么问题?虽然它可以简化为'IdTable.AsEnumerable()。其中​​(row => IDToCheck.Contains(row.Field (ID)))' –

+0

实际上这个问题并不清楚,但IDToCheck'实际上是一个'Column name idtocheck'。两个表都有几个共同的列名。我试图将它们匹配在一起,如果在表中找不到第一个ID,则查找第二个ID和另一个表的另一个列。 (这是sedol,isin ...) – Yoyo

+0

好的,但我仍然无法看到你当前的代码有什么问题? –

回答

1

我不知道你是否真的会因此获得任何性能提升。

但是,仅仅回答直接的问题:“在row.Field(ID)转换为Expression.Call”

IQueryable<DataRow> queryableData = IdTable.AsEnumerable().AsQueryable(); 

// Get the generice "Field<string>(string)" method from DataRowExtensions 
ParameterExpression pe = Expression.Parameter(typeof(DataRow), "row"); 
MethodInfo fieldMethod = typeof (DataRowExtensions).GetMethod("Field", new [] {typeof(DataRow),typeof(string)}); 
MethodInfo genericFieldMethod = fieldMethod.MakeGenericMethod(typeof (string)); 

Expression left = Expression.Call(null, genericFieldMethod, pe, Expression.Constant(col_name)); 
Expression right = Expression.Constant(value); 
Expression exp = Expression.Equal(left, right); 

IQueryable<DataRow> results = queryableData.Where(Expression.Lambda<Func<DataRow, bool>>(exp, pe));