在 EF Core 3.0 之前,这个运行良好(在服务器和客户端上都可用):
var exists = await _context.Countries.AsNoTracking().AnyAsync(x => x.CountryCode.Equals(country.CountryCode, StringComparison.OrdinalIgnoreCase));
在EF Core 3.0中,如何最好/首选翻译string.Equals(str, StringComparison.OrdinalIgnoreCase)
部分,以便查询仅在服务器端评估。
var exists = await _context.Countries.AsNoTracking().AnyAsync(x => x.CountryCode.ToUpper() == country.CountryCode.ToUpper());
或者var exists = await _context.Countries.AsNoTracking().AnyAsync(x => x.CountryCode.ToLower() == country.CountryCode.ToLower());
或者var exists = await _context.Countries.AsNoTracking().AnyAsync(x => x.CountryCode.ToUpperInvariant() == country.CountryCode.ToUpperInvariant());
或者var exists = await _context.Countries.AsNoTracking().AnyAsync(x => x.CountryCode.ToLowerInvariant() == country.CountryCode.ToLowerInvariant());
还是其他什么?
Equals
并确保该列使用不区分大小写的排序规则。问题中发布的所有片段都会导致糟糕的查询。x => x.CountryCode.==country.CountryCode
将完美地工作。 - Panagiotis Kanavos