Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 表达式树中的Like算子_.net_Linq_Entity Framework_Lambda_Expression Trees - Fatal编程技术网

.net 表达式树中的Like算子

.net 表达式树中的Like算子,.net,linq,entity-framework,lambda,expression-trees,.net,Linq,Entity Framework,Lambda,Expression Trees,我有一个Linq扩展方法,可以使用字符串值动态过滤Linq查询。例如:query.WhereHelper(“ColumnName”,“>”,1)。我可以使用许多不同的过滤器操作符,比如GreaterThan或NotEqual等,但不能使用“like”。没有Expression.Like或Expression.StartsWith等。如何对表达式树实现Like运算符?这是我的密码: public static IQueryable<T> WhereHelper<T>(thi

我有一个Linq扩展方法,可以使用字符串值动态过滤Linq查询。例如:
query.WhereHelper(“ColumnName”,“>”,1)
。我可以使用许多不同的过滤器操作符,比如GreaterThan或NotEqual等,但不能使用“like”。没有Expression.Like或Expression.StartsWith等。如何对表达式树实现Like运算符?这是我的密码:

public static IQueryable<T> WhereHelper<T>(this IQueryable<T> source, string columnName, object value, string filterType)
{
    ParameterExpression table = Expression.Parameter(typeof(T), "");
    Expression column = Expression.PropertyOrField(table, columnName);
    Expression valueExpression = Expression.Convert(Expression.Constant(value), column.Type);
    Expression where = null;

    switch (filterType)
    {
        case "<":
            where = Expression.LessThan(column, valueExpression);
            break;
        case "<=":
            where = Expression.LessThanOrEqual(column, valueExpression);
            break;
        case "=":
            where = Expression.Equal(column, valueExpression);
            break;
        case ">":
            where = Expression.GreaterThan(column, valueExpression;
            break;
        case ">=":
            where = Expression.GreaterThanOrEqual(column, valueExpression);
            break;
        case "<>":
            where = Expression.NotEqual(column, valueExpression);
            break;
    }

    Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table });

    Type[] exprArgTypes = { source.ElementType };

    MethodCallExpression methodCall = Expression.Call(typeof(Queryable),
                                                      "Where",
                                                      exprArgTypes,
                                                      source.Expression,
                                                      lambda);

    return (IQueryable<T>)source.Provider.CreateQuery<T>(methodCall);
public static IQueryable WhereHelper(此IQueryable源、字符串列名称、对象值、字符串过滤器类型)
{
ParameterExpression table=表达式.参数(typeof(T),“”);
Expression column=Expression.PropertyOrField(表,列名称);
Expression-valueExpression=Expression.Convert(Expression.Constant(value)、column.Type);
表达式,其中=null;
开关(过滤器类型)
{
案例“=”:
其中=表达式.GreaterThanOrEqual(列,值表达式);
打破
案例“”:
其中=表达式.NotEqual(列,值表达式);
打破
}
表达式lambda=Expression.lambda(其中,新参数Expression[]{table});
类型[]exprArgTypes={source.ElementType};
MethodCallExpression methodCall=Expression.Call(typeof(Queryable),
“哪里”,
exprArgTypes,
来源.表达式,
lambda);
返回(IQueryable)source.Provider.CreateQuery(methodCall);

您可以使用
表达式。使用
字符串.StartsWith
字符串.Contains
字符串.EndsWith
等方法调用
。消费代码可以将其转换回TSQL。请注意,对于LINQ to SQL,这里还有一些附加的帮助函数,但没有EF。

您可以定义类似于e的函数表达式如下:

var propertyName = "Firstname";
var propertyValue= "xxxx";

MethodInfo refmethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var parameter = Expression.Parameter(typeof(T), "type");
var property = Expression.Property(parameter, propertyName);
var value = Expression.Constant(propertyValue, typeof(string));
var containsMethodExp = Expression.Call(property, refmethod, value);

“helper函数”我的意思是-特别是
Like()
关于EF的注释是不正确的。对于L2S来说,有一个类似于
SqlMethods
的函数。但是,诸如
EndsWith
Contains
等函数在EF中是本机支持的,不需要这样的helper。我尝试了“Expression where=Expression.Call”(typeof(string),“Contains”,null,valueExpression)”并得到“type'System.string.”上不存在任何方法“Contains”。错误。我做错了什么?@Armagan-这是一个实例方法;您也需要传入左手表达式。将表达式更改为“expression.Call(列,“Contains”,null,valueExpression)“它成功了。非常感谢。经过测试,工作正常。你救了我一天!谢谢!