Jam*_*mes 4 .net linq linq-to-entities string-split
我有以下LINQ查询:
var aKeyword = "ACT";
var results = from a in db.Activities
where a.Keywords.Split(',').Contains(aKeyword) == true
select a;
Run Code Online (Sandbox Code Playgroud)
关键字是逗号分隔的字段.
每次运行此查询时,我都会收到以下错误:
"LINQ to Entities无法识别方法'Boolean Contains [String](System.Collections.Generic.IEnumerable`1 [System.String],System.String)'方法,并且此方法无法转换为商店表达式."
我想做什么的替代方案是什么?
您的问题是LINQ-to-Entites必须将您提供的所有内容翻译成SQL以发送到数据库.
如果这确实是你需要做的,你将不得不强制LINQ-to-Entities拉回所有数据和LINQ-to-Objects来评估条件.
例如:
var aKeyword = "ACT";
var results = from a in db.Activities.ToList()
where a.Keywords.Split(',').Contains(aKeyword) == true
select a;
Run Code Online (Sandbox Code Playgroud)
但请注意,这将从活动表中撤回所有对象.另一种方法可能是让DB做一些初始过滤器,然后过滤剩下的部分:
var aKeyword = "ACT";
var results = (from a in db.Activities
where a.Keywords.Contains(aKeyword)
select a).ToList().Where(a => a.KeyWords.Split(',').Contains(aKeyword));
Run Code Online (Sandbox Code Playgroud)
这将让LINQ-to-Entities执行它理解的过滤器(string.Contains变成一个类似的查询),它将过滤掉一些数据,然后在你拥有对象后通过LINQ-to-Objects应用你想要的真实过滤器.ToList()调用强制LINQ-to-Entities运行查询并构建对象,允许LINQ-to-Objects成为执行查询第二部分的引擎.
响应您对大型数据集的性能考虑:
您将在客户端上进行非索引通配符字符串匹配,所以是的,会有性能损失。
在一个表字段中有多个关键字是否有原因?您可以将其标准化,以获得一个 ActivityKeywords 表,其中对于每个活动,您都有许多关键字记录。
活动(activity_id, ... /* 删除关键字字段 */) ---> ActivityKeywords(activity_id, keyword_id) ---> 关键字(keyword_id, value)
查看非第一范式:http : //en.wikipedia.org/wiki/Database_normalization
编辑:另外,即使您坚持使用一列,也有一种方法可以在服务器端完成所有操作(如果您有严格的语法:'keyword1, keyword2, ..., keywordN'):
var aKeyword = "ACT";
var results = (from a in db.Activities
where a.Keywords.Contains("," + aKeyword) || a.Keywords.Contains(aKeyword + ",")
select a;
Run Code Online (Sandbox Code Playgroud)