【问题标题】:LINQ to Entities does not recognize the method 'Boolean IsMatch [duplicate]LINQ to Entities 无法识别方法“Boolean IsMatch [重复]
【发布时间】:2020-07-12 19:20:13
【问题描述】:

我有以下疑问:

result.AddRange((from app in db.AllJobModel where Regex.IsMatch(app.JobTitle, "\b" + listjobs + "\b", RegexOptions.IgnoreCase) && Regex.IsMatch(app.locationName, "\b" + searchLocation + "\b", RegexOptions.IgnoreCase) select app).ToList());

我得到的错误如下:

LINQ to Entities 无法识别方法 'Boolean IsMatch(System.String, System.String, System.Text.RegularExpressions.RegexOptions)' 方法,并且此方法无法转换为存储表达式。'

有人可以帮忙吗?

【问题讨论】:

    标签: c# linq-to-entities


    【解决方案1】:

    并非所有数据库引擎都支持正则表达式。即使对于那些这样做的人,我也不相信任何 LINQ-to-SQL 提供者知道如何正确地将它们转换为 SQL。您唯一的选择将是客户端评估,您可以使用AsEnumerable 实现。

    result.AddRange((
        from app in db.AllJobModel.AsEnumerable() 
        where Regex.IsMatch(app.JobTitle, "\b" + listjobs + "\b", RegexOptions.IgnoreCase) && 
              Regex.IsMatch(app.locationName, "\b" + searchLocation + "\b", RegexOptions.IgnoreCase) 
        select app
    ));
    

    注意这里的意思是所有的记录都会从数据库中返回,过滤会在内存中进行。

    根据您的数据,您可能可以通过使用 Like '% XYZ %' 的等效项来获得(注意前后的空格)。这至少会转化为 SQL 并完全在服务器上而不是在内存中运行:

    result.AddRange((
        from app in db.AllJobModel.AsEnumerable() 
        where app.JobTitle.Contains(" " + listjobs + "  ") && 
              app.locationName.Contains(" " + searchLocation + " ") 
        select app
    ));
    

    或者您可以将ContainsStartsWithEndsWith(和一个空格)组合起来,这样您应该会更接近一些:

    result.AddRange((
        from app in db.AllJobModel.AsEnumerable() 
        where (app.JobTitle.Contains(" " + listjobs + "  ") || app.JobTitle.StartsWith(listjobs + " ") || app.JobTitle.EndsWith(" " + listjobs)) && 
              (app.locationName.Contains(" " + searchLocation + " ") || app.locationName.StartsWith(searchLocation + " ") || app.locationName.EndsWith(" " + searchLocation)) 
        select app
    ));
    

    不幸的是,您将无法完全匹配您的正则表达式,但您应该能够接近。

    【讨论】:

      【解决方案2】:

      试试:

      result.AddRange((from app in db.AllJobModel where app.JobTitle.Contains("\b" + listjobs + "\b") && app.locationName.Contains("\b" + searchLocation + "\b") select app).ToList());
      

      【讨论】:

      • 这不会编译
      • 这会寻找文字字符串 "\b" + 其余部分,这没有意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多