- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一段在 EF Core 2.2 中工作的代码,用于比较字符串大小写,如下所示。
public async Task<bool> DoesItemNumberExists(Guid revisionId, string itemNumber)
{
var doesExist = await _repository.AnyAsync(a => string.Equals(a.ItemNo, itemNumber, StringComparison.Ordinal) && a.SoqHeading_NP.SoqRevisionId == revisionId);
return doesExist;
}
我在 EF Core 5 中运行相同的代码,但应用程序崩溃了。有帮助吗?
下面是我得到的异常
The LINQ expression 'DbSet<SoqItem>()
.Where(s => s.IsDeleted == False)
.Join(
inner: DbSet<SoqHeading>()
.Where(s0 => s0.SoqRevisionId == __ef_filter__RevisionId_0 && s0.IsDeleted == False),
outerKeySelector: s => EF.Property<Nullable<Guid>>(s, "SoqHeadingId"),
innerKeySelector: s0 => EF.Property<Nullable<Guid>>(s0, "Id"),
resultSelector: (o, i) => new TransparentIdentifier<SoqItem, SoqHeading>(
Outer = o,
Inner = i
))
.Any(s => string.Equals(
a: s.Outer.ItemNo,
b: __itemNumber_0,
comparisonType: Ordinal) && s.Inner.SoqRevisionId == __revisionId_1)' could not be translated. Additional information: Translation of the 'string.Equals' overload with a 'StringComparison' parameter is not supported. See https://go.microsoft.com/fwlink/?linkid=2129535 for more information. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
最佳答案
区分大小写和排序规则在文档中、在文档中、在 Collations and Case Sensitivity 中进行了说明。
这不是 EF Core 5 错误。查询总是无法转换为 SQL,但 EF Core 2 通过将所有内容加载到内存中然后在没有索引的情况下匹配客户端上的记录来弥补这一点。第一版 EF Core 中的 LINQ 翻译非常有限,甚至 GROUP BY
也无法翻译。 Entity Framework 会抛出这种情况。不过,为了避免破坏在 EF 6 中完美运行的代码,EF Core 1 和 2 使用了客户端评估:他们将可以翻译的内容转换为 SQL,然后将数据加载到客户端的内存中,并使用LINQ to 对象。
这意味着,如果您想计算 100K 行的 SUM,EF Core 1-2 会将所有 100K 行加载到内存中,然后将值逐一相加。不要介意连接两个表,每个表有 1000 行 - 这是 100 万次比较。
即使在 EF Core 2.1 中,客户端计算也会生成运行时警告,并且可以完全禁用。在 EF Core 3.1 中,客户端计算被完全禁用。
要让您的查询正常工作,不要尝试强制大小写或排序规则。只需使用一个简单的相等即可:
var itemExists=context.Products.Any(a=>a.ItemNumber == itemNumber &&
a.SoqHeading_NP.SoqRevisionId == revisionId);
这将被转换为 WHERE ItemNumber=@itemNumber && SoqHeading_NP.SoqRevisionId = @revisionId
。查询将使用覆盖 ItemNumber
和 SoqRevisionId
列的任何索引来尽快生成结果。
用于相等匹配的排序规则是列的排序规则。如果那是区分大小写的,您将获得区分大小写的匹配。如果不是,您将获得区分大小写的匹配。in。索引是使用列的排序规则构建的,因此如果您尝试使用不同的排序规则进行匹配,您将阻止服务器使用任何索引。
如果你想在不同的查询中使用不同的大小写匹配并且仍然使用索引,你需要为每个情况创建不同的索引。你如何做到这一点取决于数据库
alter table Table1 add ItemNumberCS as COLLATE ..._BIN;
create index IX_Table1_ItemNumberCS on Table1 (ItemNumberCS);
区分大小写的查询应使用 ItemNumberCS
列。
CREATE COLLATION case_insensitive (
provider = icu,
locale = 'und-u-ks-level2',
deterministic = false
);
CREATE INDEX IX_Table1_ItemNumberCI ON Table1 (title COLLATE "case_insensitive");`
LINQ 查询无需更改。
关于c# - EF 核心字符串区分大小写不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69554781/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!