我正在构建动态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);
有人对此有答案吗?请分享。
答案 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?)));