使用类型组合lambda linq的表达式调用

时间:2017-02-22 15:00:31

标签: c# linq reflection lambda expression

我正在尝试为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<string>(ID)转换为Expression.Call

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

1 个答案:

答案 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));