【问题标题】:Linq Intersect Comma Delimited String with List Containing Strings Any & AllLinq 将逗号分隔的字符串与包含字符串的列表相交
【发布时间】:2015-09-16 17:09:30
【问题描述】:

在我的数据库中有一个字段是由逗号分隔的 id 字符串。 (即“5,8,9”)用户将从创建选定 id 列表的多下拉菜单中进行选择。我想搜索用户生成的 id 列表匹配的数据库(全部和任意)。

我目前的尝试如下。

reports = reports.Where(r => r.ItemIds.Split(',').ToList().Intersect(ItemIdsList).Any());

然后……

reports = reports.Where(r => r.ItemIds.Split(',').ToList().Intersect(ItemIdsList).All());

【问题讨论】:

  • “在我的数据库中有一个字段是由逗号分隔的 id 字符串。(即'5,8,9')”这很不幸。你生活在一个极其糟糕的设计选择的后果中。
  • 我意识到设计很差。该应用程序来自一个不包含太多数据的快速而脏的数据转储。如果我需要清除记录并创建另一个表,我会的。但在我这样做之前,我只是好奇这是否可能在 linq 表达式中。谢谢!
  • 如果这些表中的数据很少,您可以在查询中将report 替换为report.AsEnumerable(),它们应该可以工作。
  • 您要么必须在VS中获取所有数据和过滤器,要么在数据库中编写一个函数来执行拆分和搜索。请参阅以下网页:sqlservercentral.com/blogs/querying-microsoft-sql-server/2013/…
  • 我将查询改写如下reports = reports.AsEnumerable().Where(r => r.ItemIds.Split(',').ToList().Intersect(ItemIdsList).All() );我得到了一个 NullReferenceException

标签: c# regex linq


【解决方案1】:

如果所有值都是不同的,即 ItemIds 和 ItemIdsList 中没有重复项,它将起作用

reports = reports.Where(r => r.ItemIds.Split(',').ToList().Intersect(ItemIdsList).Count() > 0); // instead of .Any()  
reports = reports.Where(r => r.ItemIds.Split(',').ToList().Intersect(ItemIdsList).Count() == ItemIdsList.Count()); // instead of .All()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多