在使用EntityFluent API映射的视图中使用ROW_NUMBER设置主键会使linq超时

本文关键字:设置 NUMBER linq 超时 API EntityFluent 映射 视图 ROW | 更新日期: 2023-09-27 17:59:13

我的问题如下:我通过EntityFluent API将视图映射到对象。我需要一个包含一些左联接的视图,因为表中没有唯一的标识符,因此Entity总是返回相同的对象集。在几个不同的线程/博客中,我看到了一个解决方案,包括添加一个带有的列

ROW_NUMBER() OVER (ORDER BY Id))

然后我尝试在实体中进行映射:在我的课上,我添加了一个属性

public long Row { get; set; }

在我的配置类中,我添加了

HasKey(imc => imc.Row).HasColumnName("Row")

显然,映射是有效的。不起作用的是,当我用linq查询对象时,即使是Count()也会超时;然而,当在SQL Management Studio环境中使用时,请求本身只返回大约200行。

有人见过这个问题吗?

编辑:我已经能够通过在MS SQL视图中将"row_number()"替换为newid()来绕过这个问题,但我仍然担心以后可能会出现问题。

在使用EntityFluent API映射的视图中使用ROW_NUMBER设置主键会使linq超时

您的查询速度较慢,导致超时。大约有100万人以前见过这种情况。您需要分析查询计划。如果没有索引,计算整个表的行号可能会很慢。此外,行号不能用作键,因为它的值在更改基础数据时会发生更改。EF不支持更改按键。

如果使用newid()作为视图中的"键",则每次都会获得新的ID。我想你可能没有意识到这样一个事实,即视图只是特定查询的快捷方式。它的内容没有存储在任何地方。

介绍一个可以用作关键字的列。例如IDENTITY列。