使用LINQ拆分字符串

时间:2011-12-28 07:42:30

标签: c# .net linq exception-handling linq-to-entities

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

所以这是代码

.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

3 个答案:

答案 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所述。