使用Lambda表达式进行正则表达式匹配

时间:2015-01-27 06:29:54

标签: c# regex linq lambda

我正在尝试使用LINQ to SQL为(*,?)实现通配符搜索功能。截至目前,我想使用正则表达式尝试它,因为我们编写的代码将简短且易于管理。这就是我所拥有的

  string kw=_keyword.Replace("*",".*").Replace("?",".");
        var predicate = PredicateBuilder.True<DAL.RequestAttribute>();
        Regex reg=new Regex("^"+kw+"$");
        predicate=predicate &&(reg.IsMatch(ra=>ra.AttributeValue));

所以,这里它给出了一个编译错误“无法将lambda表达式转换为'string'类型',因为它不是委托类型”

虽然我编译并运行了一些变通方法,但我得到了这个运行时错误

“方法”布尔值IsMatch(System.String)'没有支持的SQL转换。“

所以,我在这里有两个问题 1.我是否正在使用正则表达式在右侧通道中实现我的通配符?如果没有,这是更有效的方法吗? 2.如何解决此错误。

由于

2 个答案:

答案 0 :(得分:0)

您可以使用SqlMethods.Like模仿SQL的LIKE运算符:https://msdn.microsoft.com/en-us/library/system.data.linq.sqlclient.sqlmethods.like%28v=vs.110%29.aspx

请务必使用相应的通配符/令牌:https://msdn.microsoft.com/en-us/library/ms179859.aspx

更新: 您不能使用简单SQL的正则表达式。由于您实际上是通过LINQ构建SQL语句,因此适用相同的规则。但是,您仍然不太清楚使用您提供的示例代码进入LINQ的位置。

我通常希望看到以下内容:

var results = 
  from Something in SomeLinqContext 
  where SqlMethods.Like(Something.Value, kw);

答案 1 :(得分:0)

经过一番研究后,我找到了问题的答案。感谢Ventaur的建议。解决方案是类似的,但只是有点不同。 PFB代码吧

string kw=_keyword.Replace("*","%").Replace("?","_");
var predicate = PredicateBuilder.True<DAL.RequestAttribute>();
predicate = (ra => SqlMethods.Like(ra.AttributeValue, kw) && <Any other boolean conditions>

因此,它归结为如何使用我们的谓词构建器类从SQLMethods.like方法中创建表达式。