【问题标题】:How to implement context string comparison ignoring case in C# (Linq) [duplicate]如何在C#(Linq)中实现上下文字符串比较忽略大小写[重复]
【发布时间】:2021-12-03 00:06:48
【问题描述】:
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 了解更多信息。

如何实现这个查询?

【问题讨论】:

  • 自从我使用 EnitiyFramework 以来已经有一段时间了,但通常你不能在 sql 数据库中使用编程函数,因为将 c# 代码转换为 sql 函数需要花费太多精力,所以你需要使用以下函数已经存在于sql中。所以对于不区分大小写的 equals 将两个字符串转换为大写或小写,然后与 == 进行比较

标签: c# dbcontext string-comparison ignore-case


【解决方案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();

【讨论】:

    【解决方案2】:

    尝试这种方式以获得想要的结果。

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

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 1970-01-01
      • 2016-01-29
      • 2011-02-20
      • 2016-09-02
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多