2012-09-17 32 views
-2

我建立動態lambda表達式。我得到了以下操作符爲這個代碼「Contains」,「StartsWith」,「EndsWith」工作。Lambda表達式「贊」操作符可用?

的源代碼

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

運營商沒有工作。 我試過這個代碼「Like」運算符

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

任何人都可以爲此回答?請分享。

+1

你爲什麼不試着去'Contains' – Habib

回答

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示例實現)


編輯:

由於您使用實體框架,你應該使用PatIndex代替。

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

牛排,我m如果這個異常基{System.Exception的} = {「LINQ到實體無法識別方法「布爾贊(System.String,系統。 String)'方法,並且此方法不能被轉換爲商店表達式。「}源代碼var likeExpression = Expression.Call(typeof(StringHelper),」Like「,null,argLeft,argRight); return likeExpression; – sivaL

+0

啊,你用LINQ to Entities。恐怕使用自定義方法將無法正常工作。 – sloth

+0

@sivaL我更新了我的anser以顯示如何使用'PatIndex',它將像'Like'一樣工作(但僅適用於SQL Server)。 – sloth