-2

私は動的ラムダ式を構築しています。このコード「Contains」、「StartsWith」、「EndsWith」で機能する次の演算子を取得しました。

ソースコード

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

誰にもこれに対する答えがありますか?共有してください。

4

2 に答える 2

1

SqlMethods.Like がサポートされていると思います

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

ラムダ式を使用しない場合

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);
    }
}

出力:

真実

(ここからの実装例)


編集:

Entity Framework を使用しているため、PatIndex代わりに使用する必要があります。

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