比较 EntityFrameworkCore MySql 中的字符串列无法生成正确的 SQL
Comparing string columns in MySql for EntityFrameworkCore fails to generate proper SQL
我正在使用 MySql.Data.EntityFrameworkCore 版本 6.10.1-beta 编写以下 LINQ 查询:
var data = await _context
.Assets
.Where(a => string.Compare(a.Name, "b", StringComparison.OrdinalIgnoreCase) > 0)
.Take(2)
.ToListAsync();
其中 'Name' 属性 是一个字符串。换句话说,我想获得 'Name' 属性 大于 'b'.
的下 2 个数据库条目
代码从外部按预期工作,但当我查看生成的 SQL 时,我看到以下内容:
SELECT `a`.`F_ASSET_PK`, `a`.`F_ASSET_TYPE`, `a`.`F_CREATION_TIME`, `a`.`F_ID`, `a`.`F_IS_SOFT_DELETED`, `a`.`F_LAST_MODIFIED_TIME`, `a`.`F_LIBRARY_ID`, `a`.`F_NAME`, `a`.`F_OWNER_ID`, `a`.`F_TENANT_ID`
FROM `accounting`.`T_ASSET` AS `a`
如您所见,我的 LIMIT 和 WHERE 子句不在生成的 SQL 中。它们被应用在内存中导致次优性能。
如果我在 C# 中删除我的 'Where',则查询会使用 LIMIT 正确生成。因此,一旦我尝试通过 string.Compare(a.Name, "b", StringComparison.OrdinalIgnoreCase) > 0
比较查询中的字符串,MySql 驱动程序就会感到困惑,他无法生成正确的 SQL.
是否可以使用另一种语法来比较字符串,从而得到正确的 SQL?
请注意,我将此与 Microsoft.EntityFrameworkCore 1.1.0.
一起使用
回答我自己的问题:
使用 string.Compare(a.Name, "b") > 0
而不是 string.Compare(a.Name, "b", StringComparison.OrdinalIgnoreCase) > 0
。
我正在使用 MySql.Data.EntityFrameworkCore 版本 6.10.1-beta 编写以下 LINQ 查询:
var data = await _context
.Assets
.Where(a => string.Compare(a.Name, "b", StringComparison.OrdinalIgnoreCase) > 0)
.Take(2)
.ToListAsync();
其中 'Name' 属性 是一个字符串。换句话说,我想获得 'Name' 属性 大于 'b'.
的下 2 个数据库条目代码从外部按预期工作,但当我查看生成的 SQL 时,我看到以下内容:
SELECT `a`.`F_ASSET_PK`, `a`.`F_ASSET_TYPE`, `a`.`F_CREATION_TIME`, `a`.`F_ID`, `a`.`F_IS_SOFT_DELETED`, `a`.`F_LAST_MODIFIED_TIME`, `a`.`F_LIBRARY_ID`, `a`.`F_NAME`, `a`.`F_OWNER_ID`, `a`.`F_TENANT_ID`
FROM `accounting`.`T_ASSET` AS `a`
如您所见,我的 LIMIT 和 WHERE 子句不在生成的 SQL 中。它们被应用在内存中导致次优性能。
如果我在 C# 中删除我的 'Where',则查询会使用 LIMIT 正确生成。因此,一旦我尝试通过 string.Compare(a.Name, "b", StringComparison.OrdinalIgnoreCase) > 0
比较查询中的字符串,MySql 驱动程序就会感到困惑,他无法生成正确的 SQL.
是否可以使用另一种语法来比较字符串,从而得到正确的 SQL?
请注意,我将此与 Microsoft.EntityFrameworkCore 1.1.0.
一起使用回答我自己的问题:
使用 string.Compare(a.Name, "b") > 0
而不是 string.Compare(a.Name, "b", StringComparison.OrdinalIgnoreCase) > 0
。