【问题标题】:LINQ select using .split()使用 .split() 选择 LINQ
【发布时间】:2014-05-07 07:35:31
【问题描述】:

我有一个逗号分隔的字符串存储在数据库中。

例如:record1 = "1,3,5,7,9,10"record2 = "4,5,10"

我有一个给定的信息,例如:1

我必须使用 包含给定信息 1 的 LINQ 选择记录。

返回的结果应该是record1。

如果我只使用 .contains() ,它是不准确的,因为 record2 也会被返回。

我怎样才能做到这一点?是否有可能在单个 LINQ 查询中实现这一点?

感谢您的建议!

【问题讨论】:

  • 你在使用 Linq to Objects 吗?
  • 所以您使用的是LINQ-To-SQLLINQ-To-Entities,能否请您标记提供者?
  • 如果你使用Linq-To-Entities,你可以试试this SO question。
  • 您是否已经注意到真正的问题是您令人毛骨悚然的数据模型?使用包含真实记录的表,而不是使用逗号分隔字符串的列。

标签: c# linq


【解决方案1】:

使用单个 LINQ-to-objects 查询:

string[] records = new[] { record1, record2 };
string record = records.FirstOrDefault(r => r.Split(',').Any(s => s == "1"));

Demo

【讨论】:

  • 这在 LINQ-TO-"DB" 中是否也有效? OP 提到他使用数据库并想选择一条记录。
  • 好吧,如果表格适合内存,我猜为什么不呢。这样做的选项in Sql look horrid。真正的问题似乎是一个不稳定的模型。
  • @TimSchmelter 你不是真的问我是不是你;)我认为数据已经被预测,但重新阅读这个问题听起来不是那样。
  • 好吧...如果这是公认的答案,那么请等到 IIS 主机内存不足。把所有东西都记下来,然后用 split 过滤?哦亲爱的。不确定OP在做什么。但是答案没有错... :)
  • @Mahmud 同意,这种数据结构会让任何服务器都崩溃。 SQL、IIS 或其他。你只是在转移负担。虽然我的回答在技术上回答了这个问题,但 真正的 答案是 Tim Schmelter 的评论 - 数据结构完全是错误的。
【解决方案2】:

首先我想提一下@Tim Schmelter 所说的——

你有没有注意到真正的问题是你的毛骨悚然 数据模型?使用带有真实记录的表而不是带有 逗号分隔的字符串。

在需要字符串拆分匹配的情况下使用datamodel 不是一个好习惯。因为它会导致系统效率低下,更不用说慢查询了。但是,如果您真的需要解决方案,为什么不试试这个 -.

有四种情况你会得到匹配,

  1. 前缀匹配 - 以
  2. 开头
  3. 内部匹配 - 包含与
  4. 后缀匹配 - 以
  5. 结尾
  6. 唯一的匹配 - 只有一项,就是这样

考虑到我建议以下解决方案的情况 -

s is the value looking for say "1"
string prefixMatch = s + ",";
string suffixMatch = "," + s;
string innerMatch = "," + s + ",";
string record = <dbRecords>.FirstOrDefault(r=> r.StartsWith(prefixMatch) ||
r.Contains(innerMatch) || r.EndsWith(suffixMatch) || 
(!r.Contains(",") && r == s));

如此详细查询的原因是为了减少内存使用率,并让 SQL 查询完成查找结果的艰苦工作,因为此查询将支持 LINQ-to-SQL 转换。

【讨论】:

    【解决方案3】:

    如果我理解正确,您需要包含“1”的结果记录。所以你可以使用:

    private bool GerRecord(string record)
    {
        string[] arr=record.Split(',');
    
        return arr.Contains("1");
    }
    

    【讨论】:

    • 它也会返回 10。此外,您的方法与 linq2sql 无关。 Also2:GetRecord(我想是错字)不应该返回 bool。
    • @Tarec 没有。它将仅对包含“1”的记录返回 true。
    【解决方案4】:

    您可以尝试在 linQ 中的 Contains 中搜索 1,(1 和逗号组合),而不是搜索 1

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多