Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net LINQ与SQL中不区分大小写的字符串比较_.net_Vb.net_Linq - Fatal编程技术网

.net LINQ与SQL中不区分大小写的字符串比较

.net LINQ与SQL中不区分大小写的字符串比较,.net,vb.net,linq,.net,Vb.net,Linq,我已经读到使用ToUpper和ToLower来执行不区分大小写的字符串比较是不明智的,但在LINQ到SQL方面,我看不到其他选择。LINQ to SQL会忽略String.Compare的ignoreCase和CompareOptions参数(如果使用区分大小写的数据库,则即使要求进行不区分大小写的比较,也会得到区分大小写的比较)。托洛尔还是图珀是这里最好的选择?一个比另一个好吗?我想我在某个地方读到了ToUpper更好,但我不知道这是否适用于这里。(我做了很多代码审查,每个人都在使用ToLow

我已经读到使用ToUpper和ToLower来执行不区分大小写的字符串比较是不明智的,但在LINQ到SQL方面,我看不到其他选择。LINQ to SQL会忽略String.Compare的ignoreCase和CompareOptions参数(如果使用区分大小写的数据库,则即使要求进行不区分大小写的比较,也会得到区分大小写的比较)。托洛尔还是图珀是这里最好的选择?一个比另一个好吗?我想我在某个地方读到了ToUpper更好,但我不知道这是否适用于这里。(我做了很多代码审查,每个人都在使用ToLower。)


这将转换为一个SQL查询,该查询仅将row.Name与“test”进行比较,并且不会在区分大小写的数据库上返回“test”和“test”。

如果将不区分大小写的字符串传递到LINQ to SQL中,它将原封不动地传递到SQL中,比较将在数据库中进行。如果要在数据库中进行不区分大小写的字符串比较,则只需创建一个lambda表达式来进行比较,LINQ to SQL提供程序将该表达式转换为一个SQL查询,并且字符串保持不变

例如,此LINQ查询:

from user in Users
where user.Email == "foo@bar.com"
select user
由LINQ to SQL提供程序转换为以下SQL:

SELECT [t0].[Email]
FROM [User] AS [t0]
WHERE [t0].[Email] = @p0
-- note that "@p0" is defined as nvarchar(11)
-- and is passed my value of "foo@bar.com"

正如您所看到的,字符串参数将在SQL中进行比较,这意味着事情应该按照您期望的方式进行。

正如您所说,ToUpper和ToLower之间有一些重要的区别,当您尝试进行不区分大小写的相等性检查时,只有一个是可靠准确的

理想情况下,执行不区分大小写的相等性检查的最佳方法是:

String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)
但是请注意在这种情况下,这不起作用!因此,我们只能使用
touper
ToLower

注意序号IgnoreCase以确保安全。但是,您使用的区分大小写检查的确切类型取决于您的目的。但通常在排序时使用Equals进行相等性检查和比较,然后为作业选择正确的字符串比较

迈克尔·卡普兰(一位公认的文化和人物处理权威)在ToUpper vs.ToLower上发表了相关文章:

他说“String.ToUpper–使用ToUpper而不是ToLower,并指定不变量区域性以获取操作系统外壳规则”


System.Data.Linq.SqlClient.SqlMethods.Like(row.Name,“test”)
在我的问题中


这将执行不区分大小写的比较。

要执行区分大小写的Linq To Sql查询,请通过使用以下选项之一指定服务器数据类型,将“字符串”字段声明为区分大小写

varchar(4000) COLLATE SQL_Latin1_General_CP1_CS_AS 

注:上述排序规则类型中的“CS”表示“区分大小写”

当使用Visual Studio DBML Designer查看属性时,可以在“服务器数据类型”字段中输入


有关更多详细信息,请参见

我使用Lambda表达式尝试了这一方法,效果很好


List.Any(x=>(String.Equals(x.Name,Name,StringComparison.OrdinalIgnoreCase))&&(x.Type==qbType))

以下两个阶段的方法适用于我(VS2010、ASP.NET MVC3、SQL Server 2008、Linq to SQL):


请记住,查询是否有效与查询是否有效之间存在差异!当LINQ语句的目标是SQL Server时,它会转换为T-SQL,因此您需要考虑将生成的T-SQL

使用String.Equals很可能(我猜)从SQLServer返回所有行,然后在.NET中进行比较,因为它是一个无法转换为T-SQL的.NET表达式

换句话说,使用表达式将增加您的数据访问,并消除您使用索引的能力。它可以在小桌子上使用,你不会注意到区别。在一张大桌子上,它可能表现得很糟糕

这是LINQ存在的问题之一;人们不再考虑他们所写的陈述将如何实现


在本例中,没有一种方法可以不使用表达式就完成您想要的操作,即使在t-SQL中也不行。因此,您可能无法更有效地执行此操作。即使是上面给出的T-SQL答案(使用带有排序规则的变量)也很可能导致忽略索引,但如果它是一个大表,则值得运行该语句并查看执行计划以查看是否使用了索引。

有时存储在数据库中的值可能包含空格,因此运行该语句可能会失败

where row.name.StartsWith(q, true, System.Globalization.CultureInfo.CurrentCulture)
String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)
解决这个问题的方法是删除空格,然后转换其大小写,然后像这样选择

 return db.UsersTBs.Where(x => x.title.ToString().ToLower().Replace(" ",string.Empty).Equals(customname.ToLower())).FirstOrDefault();
注意在这种情况下

customname是要与数据库值匹配的值

UsersTBs是类


title是数据库列

的.NET核心,System.Data.Linq.SqlClient.SqlMethods不可用,请改用此列

EF.Functions.Like(row.Name, "test")

我不明白你在说什么。1) 字符串本身在.NET中不能区分大小写或区分大小写,因此我不能传递“不区分大小写的字符串”。2) LINQ查询基本上是一个lambda表达式,这就是我传递两个字符串的方式,所以这对我来说没有任何意义。我想在区分大小写的数据库上执行不区分大小写的比较。您使用的是哪个区分大小写的数据库?另外,LINQ查询不是lambda表达式。LINQ查询由几个部分组成(最明显的是查询运算符和lambda表达式)。这个答案与BlueMonkMN注释不符。这似乎不适用于SQL Server:print upper('Große Straße')返回Große StraßEAlso,您提供的示例代码与我提供的代码存在相同的问题,即在MS SQL 2005数据库上通过LINQ to SQL运行时区分大小写。我同意。对不起,我
String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)
 return db.UsersTBs.Where(x => x.title.ToString().ToLower().Replace(" ",string.Empty).Equals(customname.ToLower())).FirstOrDefault();
EF.Functions.Like(row.Name, "test")