C# EntityFramework Any生成两条现有sql语句

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

我想使用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 [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++编译器所提出的低效程序集时,就好像是一个装配程序的程序员。