LINQ to Entities无法识别方法'Int32 IndexOf(System.String,System.StringComparison)'方法

Cod*_*-EZ 10 .net c# linq entity-framework

我已经使用如下的Entityframework执行了linq查询

GroupMaster getGroup = null;
getGroup = DataContext.Groups.FirstOrDefault(item => keyword.IndexOf(item.Keywords,StringComparison.OrdinalIgnoreCase)>=0 && item.IsEnabled)
Run Code Online (Sandbox Code Playgroud)

执行此方法时,我得到如下的异常

LINQ to Entities无法识别方法'Int32 IndexOf(System.String,System.StringComparison)'方法,并且此方法无法转换为商店表达式.

默认情况下包含()方法区分大小写,所以我需要转换为lower.Is有任何方法检查除contains方法之外的字符串匹配,是否有任何方法来解决indexOf方法问题?

Eri*_*sch 6

你真的只有四种选择.

  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

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


Tol*_*men 5

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

var lowerCaseItem = item.ToLower();
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你深入研究一些 MS 提供的代码,它们会使用 `.ToUpper()`。对 MS 来说已经足够了,对我来说也足够了,我说。 (2认同)

小智 5

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

您也可以从这里这里获得帮助

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

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