异步方法和EntityFramework核心中的String.Compare



我试过这些:

public async Task<bool> NameExists(string name)
{
var productCategories = await this._dbContext.ProductCategories
.Where(c => String.Compare(c.Name, name, StringComparison.InvariantCultureIgnoreCase) > 0).ToListAsync();
return productCategories.Count > 0;
}
public async Task<bool> NameExists(string name)
{
int count = await this._dbContext.ProductCategories
.CountAsync(c => String.Compare(c.Name, name, StringComparison.InvariantCultureIgnoreCase) > 0).t
return count != 0;
}

但在这两种情况下,我都收到了错误消息:

System.InvalidOperationException: 'The LINQ expression 'DbSet<ProductCategory>()
.Where(p => string.Compare(
strA: p.Name, 
strB: __name_0, 
comparisonType: InvariantCultureIgnoreCase) > 0)' could not be translated

我在网上搜索了一下,但没有找到任何解决方案。

作为温度";解决方案";我使用这个:

public async Task<bool> NameExists(string name)
{
return await this._dbContext.ProductCategories.AnyAsync(x => x.Name.Trim().ToLower() == name.Trim().ToLower());

你知道如何解决这个问题吗?

谢谢,}

您可以强制进行不区分大小写的排序,有关的更多详细信息,请参阅文档

public async Task<bool> NameExists(string name)
{
var productCategories = await this._dbContext.ProductCategories
.Where(c => EF.Functions.Collate(c.Name, "Latin1_General_CI_AS") == name)
.ToListAsync();
return productCategories.Count > 0;
}

将该列的排序规则设置为不区分大小写意味着您不需要这些。比较将自动不区分大小写,并且可以使用索引。


这个特定的查询在任何情况下都是低效的。你只想知道存在,所以使用.Any而不是.Count

public async Task<bool> NameExists(string name)
{
var exists = await this._dbContext.ProductCategories
.Where(c => EF.Functions.Collate(c.Name, "Latin1_General_CI_AS") == name)
.Any();
return exists;
}