【问题标题】:Split string with LINQ使用 LINQ 拆分字符串
【发布时间】:2012-01-29 00:08:48
【问题描述】:

我想根据我的结果和我的字符串行中的匹配数进行排序。

这里是代码

.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

【问题讨论】:

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


    【解决方案1】:

    这意味着Linq to entity找不到可以写成sql查询的split方法的翻译。如果您想执行拆分功能,您必须通过调用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 转换,不是吗?
    • 是的,这是真的。最好在调用 AsEnumerable 之前在 where 子句中应用条件。如果不将对象带入内存,您将无法做到这一点
    • 我猜大表会崩溃。我同意abatishchev。
    • 正如我所说,您不会总是对表的所有数据感兴趣,您可以先使用 where 子句对其进行过滤
    • 或者,如果您更注重性能而不是模式,您可以创建一个视图并将其带到您的 emdx 上。
    【解决方案2】:

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

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

    如果您无法做到这一点,但又希望查询在数据库上运行,则必须考虑编写一个用户定义的函数来处理分隔字符串。阅读this question 了解更多信息。不过,这将是很多工作。

    如@Muhammad Adeel Zahid 所述,最简单的解决方案(如果您负担得起的话)当然是将所有内容拉回客户端,只需使用 LINQ to Objects 进行该部分查询即可。

    【讨论】:

      【解决方案3】:

      您需要在 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多