LINQ to Entities不识别方法';Int32 IndexOf(System.String,System

本文关键字:System IndexOf Int32 String Entities to 识别 方法 LINQ | 更新日期: 2023-09-27 17:59:13

我使用下面中的Entityframework执行了一个linq查询

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方法的问题吗?

LINQ to Entities不识别方法';Int32 IndexOf(System.String,System

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

你也可以从这里或这里获得帮助

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

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

这里实际上只有四个选项。

  1. 全局更改数据库的排序规则。这可以通过几种方式来实现,一个简单的谷歌搜索就可以揭示它们
  2. 更改各个表或列的排序规则
  3. 使用存储过程并在查询中指定COLATE语句
  4. 执行查询并返回一大组结果,然后使用Linq-to-Objects在内存中进行筛选

数字4不是一个好的选择,除非你的结果集很小#如果您不能更改数据库(但不能将Linq与之一起使用),那么3是很好的。

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

更改服务器排序规则:http://technet.microsoft.com/en-us/library/ms179254.aspx

更改数据库排序规则:http://technet.microsoft.com/en-us/library/ms179254.aspx

更改列排序规则:http://technet.microsoft.com/en-us/library/ms190920(v=sql.105).aspx

在存储过程中使用Collate语句:http://technet.microsoft.com/en-us/library/ms184391.aspx

相反,您可以使用下面的方法来降低案例:

var lowerCaseItem = item.ToLower();

如果您的物品类型为string。那么这可能会让你度过这个例外。

当把Erik Funkenbush的答案看作数据库问题时,它是完全有效的。但我觉得,如果你想高效地遍历关键词,你需要一个更好的结构来保存关键词数据。

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

无论时间限制如何(我意识到这不是最简单的解决方案),我的主要建议是为关键字添加一个单独的表(与相关类之间存在多对多关系)。

[GROUPS] * ------- * [KEYWORD]

这应该允许您搜索关键字,并且仅然后检索与该关键字相关的项目(基于ID而非复合字符串)。

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));
}

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