C# LINQ to实体无法识别方法';Int32 IndexOf(System.String、System.StringComparison)和#x27;方法
我使用Entityframework执行了一个linq查询,如下所示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
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();
如果您的项目属于
字符串类型
。那么这可能会帮助您克服这个异常。您在这里实际上只有四个选项
实体框架将无法识别字符串类的
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));
}