C# EntityFramework Any生成两条现有sql语句
我想使用EntityFramework的LINQ'Any'方法来检查记录的存在性 即使是最基本的查询:C# EntityFramework Any生成两条现有sql语句,c#,sql-server,linq,entity-framework,C#,Sql Server,Linq,Entity Framework,我想使用EntityFramework的LINQ'Any'方法来检查记录的存在性 即使是最基本的查询: DbContext.Users.Any() EF生成的SQL语句如下所示: SELECT CASE WHEN (EXISTS (SELECT 1 AS [C1] FROM [dbo].[User] AS [Extent1])) THEN cast(1 as bit) WHEN (NOT EXISTS (SELECT 1 AS [C1] FROM [dbo].[User] AS [Exte
DbContext.Users.Any()
EF生成的SQL语句如下所示:
SELECT CASE
WHEN (EXISTS (SELECT 1 AS [C1] FROM [dbo].[User] AS [Extent1])) THEN cast(1 as bit)
WHEN (NOT EXISTS (SELECT 1 AS [C1] FROM [dbo].[User] AS [Extent2])) THEN cast(0 as bit)
END AS [C1]
我可以强制EF生成一个EXISTS语句吗,如下所示
SELECT
(CASE
WHEN EXISTS(
SELECT NULL AS [EMPTY]
FROM [User] AS [t0]
) THEN 1
ELSE 0
END) AS [value]
更新
在以下链接中,EF生成单个EXISTS语句:
我使用的是EF 6.1.0,所以看起来旧版本确实生成了一条语句?这在EF 6.1中得到了修复,所以只要升级,您就可以得到更好的生成查询 如果无法升级,或许可以重写C代码,强制EF生成更好的SQL查询 DbContext.Users.Count()>0
这将比另一个更好,但比EF 6.1生成的查询更差。不要重新发明轮子。您可以始终使用StoredProcedures或原始sql强制它执行某些操作。如果你怀疑这是个问题,我会先看看执行计划。令人惊讶的是,丑陋的sql并不总是很慢,sqlI会为此投入大量资金,但无论如何,这不是一个实际问题。在SQL中,您告诉系统您想要什么,而不是如何做。而且,即使服务器毫无顾忌地查询表两次,只要找到一行,它就会完成每个
EXISTS
。没有过滤器。因此,它可能会从表中读取一行两次,而不是一次。这值得大惊小怪吗?如果你不喜欢这个,当你看到EF在面对更复杂的查询时会生成什么时,你会把****吓坏的。拥抱它。基本上,当他们看到C++编译器所提出的低效程序集时,就好像是一个装配程序的程序员。