如何解决动态linq中的Regex.IsMatch
如何在Regex.IsMatch()
中调用IQueryable
?
我发现了同样的问题,但没有用
Invoking Regex.IsMatch() inside a dynamic linq query
首先我有
IQueryable Database = data.Verses.Select($"new {{ ID,{TextSearchType.ToString()} }}");
我尝试过
var searchResult = Database.Where(Parse());
public static LambdaExpression Parse()
{
ParsingConfig.Default.CustomTypeProvider = new MyCustomTypeProvider();
var options = RegexOptions.IgnoreCase;
string compilableExpression = $"Regex.IsMatch({TextSearchType.ToString()},\"(^| ){Keyword}($| )\",@0) == true";
ParameterExpression parameter = Expression.Parameter(typeof(Verses));
var DynamicExpression = DynamicExpressionParser.ParseLambda(new[] { parameter },null,compilableExpression,options);
return DynamicExpression;
}
public class MyCustomTypeProvider : DefaultDynamicLinqCustomTypeProvider
{
public override HashSet<Type> GetCustomTypes()
{
return new HashSet<Type>
{
typeof(Object),typeof(Boolean),typeof(System.Text.RegularExpressions.Regex),typeof(System.Text.RegularExpressions.RegexOptions),};
}
}
TextSearchType
是Verses类中的属性名称。
我收到此错误
类型'System.Linq.Queryable'上没有通用方法'Where'是 与提供的类型实参和实参兼容。没有类型 如果该方法是非泛型的,则应提供参数。
这是我试图转换为动态linq的linq代码
var rx = new Regex("(^| )" + keyword + "($| )",RegexOptions.IgnoreCase);
var searchResult = Database.AsEnumerable()
.Where(x => rx.IsMatch(x.AyahText)).ToList();
解决方法
您无法在LINQ to Entities中调用IsMatch
或任何其他非SQL支持的函数(请参阅完整列表here)。
为了做您想做的事,您有两个可能的选择(也许更多,但是我现在知道两个):
- 通过原始过滤(不使用
IsMatch
)来获取项目,并通过在查询结束时调用List
将结果转换为.ToList()
。然后您可以按Regex.IsMatch
过滤集合。
老实说,这不是一个更好的解决方案,我不会说我喜欢它。 - 创建一个存储过程,并从c#(官方文档here)中调用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。