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方法的问题吗?
实体框架不会识别字符串类的IndexOf
方法,请将此函数替换为SQLfunction或规范函数
你也可以从这里或这里获得帮助
您可以使用以下代码示例:
DataContext.Groups.FirstOrDefault(item =>
System.Data.Objects.SqlClient.SqlFunctions.CharIndex(item.Keywords, keyword).Value >=0 && item.IsEnabled)
这里实际上只有四个选项。
- 全局更改数据库的排序规则。这可以通过几种方式来实现,一个简单的谷歌搜索就可以揭示它们
- 更改各个表或列的排序规则
- 使用存储过程并在查询中指定COLATE语句
- 执行查询并返回一大组结果,然后使用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
。那么这可能会让你度过这个例外。
请注意,这个答案并不是为了更好,而是为了解决数据模型中的问题,而不是让环境适应您现有的当前(显然有缺陷,因为存在问题)数据模型。
无论时间限制如何(我意识到这不是最简单的解决方案),我的主要建议是为关键字添加一个单独的表(与相关类之间存在多对多关系)。
[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));
}
但我完全可以理解,如果这种类型的修复在当前项目中不再可能。不过,我想提一下,以防将来有人在这个问题上出错,并且仍然可以选择改进数据结构。