使用LINQ拆分字符串

我希望通过我的结果来命令我的字符串行中的匹配计数。

所以这是代码

.ThenByDescending(p => p.Title.ToLower() .Split(' ') .Count(w => words.Any(w.Contains))); 

但它给我带来了错误,并说LINQ无法将Split解析为SQL。

LINQ to Entities无法识别方法’System.String [] Split(Char [])’方法,而且此方法无法转换为商店表达式。

如何通过LINQ实现Split?

例如,对于此数组,它必须以这种方式排序

 words = { "a", "ab" } ab a ggaaag gh //3 matches ba ab ggt //2 matches dd //0 matches 

这意味着Linq对实体未能找到可以写成sql查询的split方法的翻译。 如果要执行拆分function,则必须通过调用ToList()AsEnumerable()等将记录带入内存。

 var result = (from t in db.Table select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....); 

人们不能指望LINQ to Entities能够将其转换为SQL。

最佳解决方案是更改架构,使post标题中的每个单词作为单独的行存储在单独的表中(具有适当的关联)。 然后,查询可以使用显式(组)连接操作或FK关联属性。

如果您不能这样做并且希望查询在数据库上运行,那么您将不得不考虑编写用户定义的函数来处理分隔的字符串。 阅读此问题以获取更多信息。 这将是一项很多工作。

最简单的解决方案(如果你能负担得起的话)当然就是把所有东西都拉回到客户端,只需使用LINQ to Objects查询那部分内容,如@Muhammad Adeel Zahid所述。

您需要在LINQ to Objects中执行排序,因为LINQ to Entities无法将C#代码转换为SQL(或您正在使用的任何DB的语言)。

你可以这样做。

 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。