【问题标题】:LINQ get last position of special charLINQ获取特殊字符的最后位置
【发布时间】:2015-03-24 20:18:01
【问题描述】:

我有一个简单的 LINQ 查询(通过 EF 到实体的 linq)

var QueueList = (from q in context.queues                                        
                 select new { 
                             Qid = q.id, 
                             Qname = q.name.Substring(q.name.IndexOf(":") + 2) 
                 }).ToList();

我遇到的问题是 Qname。数据库中的名称通常如下所示:

公司::队列名称

但现在我有一些新队列,名称如下所示:

公司::组::队列名称

所以我不需要在字符串中找到第一个 ":" 而是最后一个。

SQL 不支持“LastIndexOf()”方法。那么如何获得 QueueName 中的最后一个 ":" 呢?

我用“Reverse()”尝试过,但结果有点错误(gnirts 而不是 string)。

【问题讨论】:

  • 那么 Linq to SQL 支持 Substring 和 IndexOf 吗?
  • 你可以做两次Reverse,如果这有效,但会产生镜像结果。
  • q.name.Substring(q.name.IndexOf(":") + 2 完美运行!内查询双反转?
  • 为什么要将多个信息存储在一个字符串中?为什么不使用多个列,可能是新表CompanyGroupQueue 以及主表中的外键。
  • 我不存储它们。我仍然不允许触摸数据库(请不要对此提出任何问题)。所以我必须在我的编码中做所有事情。喜欢这个小部分。

标签: c# sql linq substring lastindexof


【解决方案1】:

如果我是你,我会放弃尝试使用转换为 Sql 字符串函数的函数来进行字符串操作。

而只是选择完整的字符串并在检索后翻译它。

即:

var QueueList = (from q in context.queues                                        
                 select new { 
                             Qid = q.id, 
                             Qname = q.name 
                 }).ToList()
    .Select(x => new {
         Qid = x.Qid, 
         Qname = x.Qname.Substring(x.Qname.LastIndexOf(":") + 1) 
    });

将 Substring/LastIndexOf 函数移到 ToList() 之后意味着它们只是作用于已检索到的字符串的 .Net 本机函数,而不必转换为作用于数据库的 SQL 函数。

【讨论】:

  • 工作得很好——我已经尝试将这个匿名QueueList 写入另一个或覆盖 Qname(这是不可能的)。但是我从来没有想过选择查询本身 - 非常感谢
  • 没问题,乐于助人!
猜你喜欢
  • 2021-10-19
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多