我有一个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
}
感谢您的帮助...
答案 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)
使用IndexOf
和StringComparison.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了解文档