Lambda表达“喜欢”运营商可用吗?

时间:2012-09-17 10:40:12

标签: c# lambda

我正在构建动态lambda表达式。我使用以下运算符来处理此代码“Contains”,“StartsWith”,“EndsWith”。

源代码

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

喜欢运算符无效。 我为“Like”Operator

尝试了这段代码
var likeExpression = Expression.Call(
                    typeof(System.Data.Linq.SqlClient.SqlMethods), "Like", null, argLeft, argRight);

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

2 个答案:

答案 0 :(得分:1)

我相信支持SqlMethods.Like

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

如果不使用lambda表达式

list.exists(element => element.Contains(“your search string”);

答案 1 :(得分: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);
    }
}

<强>输出:

  

(来自here的示例实现)


修改

由于您使用的是Entity Framework,因此您应该使用PatIndex

var likeExpression = Expression.GreaterThan(Expression.Call(typeof(SqlFunctions), "PatIndex", null, argLeft, argRight),
                                            Expression.Constant(0, typeof(int?)));