我想通过我的结果来命令我的字符串中的匹配计数。
所以这是代码
.ThenByDescending(p => p.Title.ToLower()
.Split(' ')
.Count(w => words.Any(w.Contains)));
但是它给我带来了错误,并说LINQ无法将Split
解析为SQL。
LINQ to Entities无法识别方法'System.String [] 拆分(Char [])'方法,这个方法无法翻译成一个 商店表达。
如何通过LINQ实现Split?
例如,对于此数组,它必须以这种方式排序
words = { "a", "ab" }
ab a ggaaag gh //3 matches
ba ab ggt //2 matches
dd //0 matches
答案 0 :(得分:8)
这意味着Linq to实体未能找到可以写为sql查询的split方法的翻译。如果你想执行拆分功能,你必须通过调用ToList()
,AsEnumerable()
等将记录带入内存。
var result = (from t in db.Table
select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....);
答案 1 :(得分:2)
您需要在LINQ to Objects中执行排序,因为LINQ to Entities无法将C#代码转换为SQL(或您正在使用的任何数据库的语言)。
你可以这样做。
var results =
objectContext
.Where(a => a == b) //Whatever
.AsEnumerable()
.ThenByDescending(p=>p.Title.ToLower().Split(' ').Count(w=>words.Any(w.Contains)));
AsEnumerable()
(以及ToArray()
或ToList()
)将LINQ to Entities转回LINQ to Objects。
答案 2 :(得分:2)
我们不能指望LINQ to Entities能够将其转换为SQL。
最佳解决方案是更改架构,使帖子标题中的每个单词作为单独的行存储在单独的表中(具有适当的关联)。然后,查询可以使用显式(组)连接操作或FK关联属性。
如果你不能这样做并且希望查询在数据库上运行,你将不得不考虑编写一个用户定义的函数来处理分隔的字符串。请阅读this question了解详情。这将是很多工作。
最简单的解决方案(如果你能负担得起)当然是将所有东西都拉回到客户端,只需使用LINQ to Objects查询那部分内容,如@Muhammad Adeel Zahid所述。