使用LINQ拆分字符串
本文关键字:字符串 拆分 LINQ 使用 | 更新日期: 2023-09-27 18:18:51
我想按我的结果排序与匹配计数在我的字符串行。
这里是代码.ThenByDescending(p => p.Title.ToLower()
.Split(' ')
.Count(w => words.Any(w.Contains)));
但是它给我带来错误,说LINQ不能解析Split
成SQL。
LINQ to Entities不能识别方法System。String []Split(Char[])'方法,此方法不能转换为存储表达式。
如何通过LINQ实现拆分?
例如,对于这个数组,它必须按以下方式排序
words = { "a", "ab" }
ab a ggaaag gh //3 matches
ba ab ggt //2 matches
dd //0 matches
这意味着Linq对实体未能找到可以写成sql查询的拆分方法的翻译。如果要执行拆分功能,则必须通过调用ToList()
, AsEnumerable()
等将记录带入内存。
var result = (from t in db.Table
select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....);
您需要在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转换为对对象的LINQ。
不能指望LINQ to Entities能够将其转换为SQL。
最好的解决方案是更改模式,以便将文章标题中的每个单词作为单独的行存储在单独的表中(具有适当的关联)。然后,查询可以使用显式(组)连接操作或FK关联属性。
如果您不能这样做,但又希望查询在数据库上运行,则必须考虑编写用户定义的函数来处理分隔的字符串。阅读这个问题了解更多信息。这将是大量的工作。
最简单的解决方案(如果你能负担得起的话)当然是把所有的东西都拉回客户端,只使用LINQ to Objects来处理那部分查询,正如@Muhammad Adeel Zahid所提到的。