-2

我正在构建动态 lambda 表达式。我让以下运算符为此代码“包含”、“StartsWith”、“EndsWith”工作。

源代码

var method = typeof(string).GetMethod(opType.ToString(), new[] { typeof(string) }); 
var startsWithDishExpr = Expression.Call(argLeft, method, argRight);

但是Like运算符不起作用。我为“Like”运算符尝试了此代码

var likeExpression = Expression.Call(
                    typeof(System.Data.Linq.SqlClient.SqlMethods), "Like", null, argLeft, argRight);

有人对此有答案吗?请分享。

4

2 回答 2

1

我相信支持 SqlMethods.Like

http://msdn.microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.like.aspx

如果不使用 lambda 表达式

list.exists(element => element.Contains("你的搜索字符串");

于 2012-09-17T10:53:36.787 回答
1

你不能使用System.Data.Linq.SqlClient.SqlMethods,所以你必须自己创建一个Like方法。


例子:

void Main()
{
    var argLeft = Expression.Constant("Foobar", typeof(string));
    var argRight = Expression.Constant("F%b%r", typeof(string));

    var likeExpression = Expression.Call(typeof(StringHelper), "Like", null, argLeft, argRight);

    Expression.Lambda(likeExpression).Compile().DynamicInvoke().Dump();
}
public static class StringHelper
{
    public static bool Like(string toSearch, string toFind)
    {
        return new Regex(@"\A" + new Regex(@"\.|\$|\^|\{|\[|\(|\||\)|\*|\+|\?|\\").Replace(toFind, ch => @"\" + ch)
                                                                                  .Replace('_', '.')
                                                                                  .Replace("%", ".*") + @"\z", 
                         RegexOptions.Singleline).IsMatch(toSearch);
    }
}

输出:

真的

此处的示例实现)


编辑:

由于您使用的是实体框架,因此您应该PatIndex改用。

var likeExpression = Expression.GreaterThan(Expression.Call(typeof(SqlFunctions), "PatIndex", null, argLeft, argRight),
                                            Expression.Constant(0, typeof(int?)));
于 2012-09-17T10:56:17.027 回答