【问题标题】:Expression Call with Type Combining lambda linq where使用类型组合的表达式调用 lambda linq where
【发布时间】:2017-02-22 15:00:30
【问题描述】:

我正在尝试为 DataTable 创建一个动态查找过滤器。

代码目前看起来像这样,我正在循环遍历每一行/列。 (一张桌子喂另一张)

    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&lt;string&gt;(ID) 转换为Expression.Call

我正在尝试重现Microsoft 的示例。

【问题讨论】:

  • 您为什么要这样做?你有什么问题?虽然可以简化为IdTable.AsEnumerable().Where(row =&gt; IDToCheck.Contains(row.Field&lt;string&gt;(ID)))
  • 实际上问题并不清楚,但IDToCheck实际上是Column name idtocheck。两个表都有几个共同的列名。我正在尝试将它们匹配在一起,如果在表中找不到第一个 ID,则查找第二个 ID 和另一个表的另一列。 (是给sedol,isin...)
  • 好的,但我还是看不出你当前的代码有什么问题?
  • 我认为使用紧凑的 lambda 表达式 OR 会更快。我在想逐行而不是逐列会更快。

标签: c# linq reflection lambda expression


【解决方案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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多