C# LINQ to实体无法识别方法';Int32 IndexOf(System.String、System.StringComparison)和#x27;方法

C# LINQ to实体无法识别方法';Int32 IndexOf(System.String、System.StringComparison)和#x27;方法,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我使用Entityframework执行了一个linq查询,如下所示 GroupMaster getGroup = null; getGroup = DataContext.Groups.FirstOrDefault(item => keyword.IndexOf(item.Keywords,StringComparison.OrdinalIgnoreCase)>=0 && item.IsEnabled) 当执行此方法时,我得到如下异常 GroupMaster ge

我使用Entityframework执行了一个linq查询,如下所示

GroupMaster getGroup = null;
getGroup = DataContext.Groups.FirstOrDefault(item => keyword.IndexOf(item.Keywords,StringComparison.OrdinalIgnoreCase)>=0 && item.IsEnabled)
当执行此方法时,我得到如下异常

GroupMaster getGroup = null;
getGroup = DataContext.Groups.FirstOrDefault(item => keyword.IndexOf(item.Keywords,StringComparison.OrdinalIgnoreCase)>=0 && item.IsEnabled)
LINQ to Entities无法识别方法“Int32 IndexOf(System.String,System.StringComparison)”方法,因此 方法无法转换为存储表达式


默认情况下,Contains()方法区分大小写,因此我需要再次转换为lower。除了Contains方法外,是否有其他方法用于检查字符串匹配,以及是否有任何方法可以解决indexOf方法问题?

相反,您可以使用下面的此方法来降低大小写:

var lowerCaseItem = item.ToLower();

如果您的项目属于
字符串类型
。那么这可能会帮助您克服这个异常。

您在这里实际上只有四个选项

  • 全局更改数据库的排序规则。这可以通过几种方式实现,一个简单的谷歌搜索应该可以发现它们
  • 更改单个表或列的排序规则
  • 使用存储过程并在查询中指定COLATE语句
  • 执行查询并返回大量结果,然后使用Linq to对象在内存中进行筛选
  • 数字4不是一个好的选择,除非你的结果集很小#如果不能更改数据库(但不能使用Linq),那么3是很好的

    数字1和2是您需要对整个数据模型做出的选择,或者如果您只想对特定字段进行选择

    更改服务器排序规则:

    更改数据库排序规则:

    更改列排序规则:

    在存储过程中使用Collate语句:

    实体框架将无法识别字符串类的
    IndexOf
    方法,请将此函数替换为或

    你也可以从别人那里得到帮助

    您可以使用以下代码示例:

    DataContext.Groups.FirstOrDefault(item => 
        System.Data.Objects.SqlClient.SqlFunctions.CharIndex(item.Keywords, keyword).Value >=0 && item.IsEnabled)
    

    埃里克·芬肯布什(Erik Funkenbush)的答案在将其视为数据库问题时完全有效。但是我觉得如果你想有效地遍历关键字,你需要一个更好的结构来保存有关关键字的数据

    请注意,这个答案并不是为了更好,而是为了解决数据模型中的问题,而不是使环境适应当前(显然存在缺陷,因为存在问题)的数据模型

    我的主要建议是,不管时间限制如何(我意识到这不是最简单的修复方法),为关键字添加一个单独的表(与相关类有多对多关系)

    这应该允许您搜索关键字,然后只检索与该关键字相关的项目(基于ID而不是复合字符串)


    但是我完全可以理解,如果这种类型的修复在当前项目中不再可行。不过我想提一下,如果将来有人偶然发现这个问题,仍然可以选择改进数据结构。

    如果您公开
    DataContext.Groups
    对象的相关字段,我可能会改进答案。
    Contains
    在生成的SQL查询中转换为
    LIKE
    语句。事实上,这类
    是区分大小写还是不区分大小写取决于数据库配置。更改数据库以执行不区分大小写的字符串比较,并使用
    Contains
    。这是一个实体框架datacontext,其中组是dbseti如果它不是SqlFunctions的一部分,则必须使用LINQ to OBJECTS来查询实体。实际上,在包含方法中,我认为它们正在检查相同的功能索引,那么为什么entityframework抛出异常。通过使用string.contains().toLower()我可以解决此问题,但toLower再次成为一个重载。string.indexof我可以检查大小写。我期待的不是我所看到的方法,但我猜你走错了方向。@MarcinJuraszek的评论不会起作用吗?除了解决这个问题之外,我最大的疑问是在contains方法中我认为他们正在检查相同的功能索引,那么为什么entityframework会抛出异常?你说“检查相同的功能索引”是什么意思?如果你深入研究他们使用的一些MS提供的代码
    .ToUpper()
    。我说,对MS来说已经够好了,对我来说也够好了。
    int? keywordID = DataContext.Keywords.Where(x => x.Name == keywordFilter).Select(x => x.Id).FirstOrDefault();
    
    if(keywordID != null)
    {
        getGroup = DataContext.Groups.FirstOrDefault(group => group.Keywords.Any(kw => kw.Id == keywordID));
    }