【问题标题】:LinQ WHERE string.Contains or string.IndexOf?LinQ WHERE string.Contains 还是 string.IndexOf?
【发布时间】:2015-01-07 11:35:54
【问题描述】:

我需要写一些与以下结果相同的东西:

var result = collection.Where( o => o.Name.IndexOf( "some_string2" ) != -1 || o.Name.IndexOf( "some_string_2" ) != -1 || o.Name.IndexOf( "some_string3" ) != -1 )

要检查的字符串的数量和值(some_string_1、2 和 3)是未知的(来自 DB),所以更通用的...

我尝试了以下方法,但失败了...

var stringsToCheck = someCommaSeparatedStrings.ToLower().Split( ',' ).ToList();
var result = collection.Where( o => stringsToCheck.Contains( o.ToLower() ) );

换句话说,我需要从一个集合中检索名称包含某些特定字符串的所有对象。

【问题讨论】:

  • 这是 EF 还是 LINQ to objects?
  • @flq 他使用了collection这个词,所以可能两者都不是。
  • 好吧,我问是因为如果它是 LINQ to objects 应该可以工作......
  • 为什么会失败(错误信息是什么)?我假设您使用的是 LINQ to SQL。
  • @Seb Johnathan 实际上是正确的。您应该更正确地解释什么不起作用以及为什么。就我而言,我能够回答是因为我只是忽略了您的尝试,查看了您提出的问题并从头开始解决。如果我只看到您的第二个实现而不是完整的要求,我将不知道出了什么问题或如何解决它。

标签: c# .net linq


【解决方案1】:
var result = collection.Where(item => stringsToCheck.Any(stringToCheck => 
    item.Name.Contains(stringToCheck)));

用英文阅读是:给我集合中的所有项目,在所有要检查的字符串中,其中一个是集合中字符串的子字符串。

【讨论】:

  • 声明不起作用。给出错误消息 Local sequence cannot be used in LINQ to SQL implementations of query operator except the Contains operator.
  • @SteveStaple 这是一个关于查询内存集合的问题,而不是 LINQ to SQL 查询。
【解决方案2】:

如果你想测试o.Name 是否包含stringToCheck 那么:

var result = collection.Where( o => stringsToCheck.Any(a => o.Name.Contains(a)));

如果你只需要测试是否相等,那么:

var result = collection.Where( o => stringsToCheck.Contains(o.Name));

注意:如果您需要应用大小写规范化,则应相应地应用 ToLower()

【讨论】:

  • 请注意,任何时候您看到Count() > 0 的铃声都应该响起,您应该改用Any()。首先,Any 在语义上代表您的意思,其次,它可以短路(一旦找到匹配项就结束),而不需要评估整个查询。
  • @Servy,是的,好电话。尤其是第一次“真实”评估的即时回报。相应地更新了我的帖子 - 谢谢。
  • 谢谢,这正是我想要的 :)
【解决方案3】:

您正在检查集合元素 o.ToLower() 我假设您必须检查其名称 o.Name.ToLower()

【讨论】:

    【解决方案4】:

    如果您想检查o.Name 是否包含来自stringsToCheck 的一些string,我建议使用LinqKit 并使用PredicateBuilder 构建查询。

    var predicate = PredicateBuilder.False<TypeOfYourObject>();
    var stringsToCheck = someCommaSeparatedStrings.ToLower().Split( ',' ).ToList();
    
    foreach(var str in stringsToCheck)
    {
         var tmp = str; 
         predicate = predicate.Or(o=> o.Name.IndexOf(tmp) != -1);
    } 
    resultQuery = collection.Where(predicate); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多