2017-02-22 33 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));