0
var foundName = await (the Context)
                      .Search<MyEntity>(x => x.Name.Equals(data.Name, StringComparison.OrdinalIgnoreCase))
                      .AsNoTracking()
                      .FirstOrDefaultAsync();

我收到了这个错误:

无法翻译 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

如何实现这个查询?

4

2 回答 2

1

您只能进行普通的 C#==string1.Equals(string2)类型比较,Entity Framework 无法理解其他任何内容,这就是您看到该异常的原因。

事实上,它被转换为 SQL 并最终依赖于您为该数据库设置的排序规则。因此,如果您想要不区分大小写的比较,请确保使用不区分大小写的排序规则,例如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();
于 2021-10-14T16:14:41.477 回答
-1

尝试这种方式以获得所需的结果。

var foundName = await (the Context)
    .Where<MyEntity>(x => x.Name.ToLower() == data.Name.ToLower())
    .AsNoTracking().FirstOrDefaultAsync();
于 2021-10-14T16:29:06.813 回答