如何在C#(Linq)中实现忽略大小写的上下文字符串比较

41 浏览
0 Comments

如何在C#(Linq)中实现忽略大小写的上下文字符串比较

我得到了这个错误:

无法翻译LINQ表达式'DbSet() .Where(s => s.Name.Equals( value: __data_Name_0, comparisonType: OrdinalIgnoreCase))'。附加信息:不支持具有'StringComparison'参数的'string.Equals'重载。请参阅https://go.microsoft.com/fwlink/?linkid=2129535获取更多信息。要么以可翻译的形式重写查询,要么通过插入'AsEnumerable'、'AsAsyncEnumerable'、'ToList'或'ToListAsync'的调用明确切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038获取更多信息。

如何实现这个查询?

0
0 Comments

问题的出现原因:在C#的LINQ中,当我们需要比较两个字符串是否相等时,常常使用Equals方法。然而,Equals方法默认是区分大小写的,这就意味着如果我们想要忽略字符串的大小写进行比较,就需要另外的方式来实现。

解决方法:在上述代码中,我们可以看到使用了ToLower()方法将字符串转换为小写,然后再进行比较。这样可以忽略字符串的大小写,从而实现了上下文字符串的比较。

整理成一篇文章:

在C#的LINQ中,我们经常需要比较两个字符串是否相等。通常情况下,我们会使用Equals方法来实现这个功能。然而,Equals方法默认是区分大小写的,这就意味着如果我们想要忽略字符串的大小写进行比较,就需要另外的方式来实现。

在C#中,我们可以使用ToLower()方法将字符串转换为小写,然后再进行比较。这样可以忽略字符串的大小写,从而实现了上下文字符串的比较。下面是一个示例代码:

var foundName = await (the Context)
    .Where(x => x.Name.ToLower() == data.Name.ToLower())
    .AsNoTracking().FirstOrDefaultAsync();

在上述代码中,我们通过调用ToLower()方法将字符串转换为小写,然后再进行比较。这样就可以忽略字符串的大小写,从而实现了上下文字符串的比较。

通过以上的方法,我们可以很方便地在C#的LINQ中实现上下文字符串的比较,而忽略字符串的大小写。这样可以提高代码的可读性和灵活性,同时也减少了错误的可能性。

0
0 Comments

问题出现的原因是,Entity Framework只能理解普通的C#的字符串比较方式,即==string1.Equals(string2)。对于其他方式的比较,Entity Framework无法识别,因此会出现异常。

实际上,Entity Framework会将字符串比较转换为SQL查询,并且最终依赖于你在数据库中设置的排序规则(collation)。所以,如果你想进行大小写不敏感的比较,确保使用大小写不敏感的排序规则,如SQL_Latin1_General_CP1_CI_AS

你也可以使用一些原始的SQL查询,但我不建议这样做。例如:

var sql = "SELECT * FROM dbo.Zombies WHERE Name = 'BrainEater' COLLATE SQL_Latin1_General_CP1_CI_AS";
var blogs = await context.Zombies
    .FromSqlRaw(sql)
    .ToListAsync();

解决方法是,在字符串比较的时候,使用大小写不敏感的排序规则(collation),确保数据库能够正确地执行大小写不敏感的比较操作。

0