不区分大小写"包含"在Linq

时间:2014-11-24 14:29:45

标签: c# linq

我有一个mvc项目,我在其中使用linq。 在我的数据库中有一些记录,例如“Someth ing”,“SOmeTH ing”,“someTh ing”,“SOMETH ING”,“someTH ING”

我想这样做:

SELECT * FROM dbo.doc_dt_records WHERE name LIKE '%' + @records.Name + '%'

但是,如果我运行此代码,list.Count将返回0.我该怎么办?

    records.Name = "someth ing"; //for example
    var rec = db.Records.ToList();
         var lists = rec.Where(p => p.Name.Contains(records.Name)).ToList();
if (lists.Count > 0)
{
    // do sthng
}

感谢您的帮助...

5 个答案:

答案 0 :(得分:9)

简单的方法是使用ToLower()方法

var lists = rec.Where(p => p.Name.ToLower().Contains(records.Name.ToLower())).ToList();

更好的解决方案(基于这篇文章:Case insensitive 'Contains(string)'

 var lists = rec.Where(p => 
             CultureInfo.CurrentCulture.CompareInfo.IndexOf
             (p.Name, records.Name, CompareOptions.IgnoreCase) >= 0).ToList();

答案 1 :(得分:3)

这完全不是LINQ问题。

生成的SQL的大小写敏感度取决于与表相关的排序规则。在您的情况下哪个可能不区分大小写。

您将从您发出的任何SQL中获得相同的结果。

答案 2 :(得分:2)

使用IndexOfStringComparison.OrdinalIgnoreCase

p.Name.IndexOf(records.Name, StringComparison.OrdinalIgnoreCase) >= 0;

您可以创建如下的扩展功能:

public static bool Contains(this string src, string toCheck, StringComparison comp)
{
    return src.IndexOf(toCheck, comp) >= 0;
}

答案 3 :(得分:1)

据我所知,这个问题没有明确的答案。问题在于,执行此操作的最佳方法取决于问题中未提供的细节。例如,您使用什么精确的ORM以及连接到什么精确的DB服务器。例如,如果您将实体框架用于MS SQL Server,则最好不要触摸LINQ表达式。您需要做的只是在与字符串进行比较的数据库/表/列上set the case-insensitive collation。这将比您的LINQ表达式的任何更改都好得多。问题是,将LINQ转换为SQL时,最好直接比较对字符串具有不区分大小写的排序规则的列。仅仅因为它通常能更快地工作,并且是解决问题的自然方法。 您不希望最终查询是这样的:

SELECT  *
  FROM  AspNetUsers     U
 WHERE  UPPER(U.Name)   LIKE '%SOMETHING%';

想出类似这样的东西会更好:

SELECT  *
  FROM  AspNetUsers U
 WHERE  U.Name      LIKE '%SOMETHING%';

但是[Name]列的大小写不区分大小写。区别在于,如果让我们说包含[Name]列的索引,则第二个查询可能会使用它,而第一个查询无论如何都会对表进行完整扫描。

因此,假设records引用了DBSet<T>,而record只是类型为T的一个对象。您的代码将如下所示:

var lists = records.Where(p => p.Name.Contains(record.Name)).ToList();

然后其余的工作在SQL服务器上。或者,如果您只需要知道列表中有任何值并且不需要这些值,那么这样做会更好:

if (records.Any(p => p.Name.Contains(record.Name)))
{
    // do something
}

通常来说,如果您使用连接到任何类型的SQL Server的任何类型的ORM,则最好通过设置服务器/数据库/表/列的适当参数来区分大小写。而且只有在不可能或太昂贵时,您才考虑其他可能性。否则,您可能会遇到一些意想不到且非常不愉快的行为。例如,如果Entity Framework Core 2.x无法将您的LINQ表达式直接转换为SQL查询,那么它正在采取不同的技巧来将服务器端操作替换为客户端操作。因此,您可以得到一个解决方案,该解决方案将从表中获取所有数据到客户端,并在那里进行过滤。如果您的桌子足够大,可能会是一个很大的问题。

对于本地处理LINQ查询的情况,有很多方法可以解决。我最喜欢的一个是下一个:

        var lists = records.Where(p => p.Name
            .Contains(record.Name, StringComparison.InvariantCultureIgnoreCase))
            .ToList();

答案 4 :(得分:0)

试试这个

var lists = rec.Where(p => String.Equals(p.Name,records.Name,StringComparison.OrdinalIgnoreCase)).ToList();

请参阅here了解文档