我正在尝试使用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.如何解决此错误。
由于
答案 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方法中创建表达式。