相同的linq查询在不同的项目中生成不同的sql

asd*_*hak 0 c# linq entity-framework

查询是:

        var query =
                from stokHareket1 in ce.StokHarekets
                from stokHareket2 in ce.StokHarekets
                join stok in ce.Stoks on stokHareket1.StokId equals stok.Id
                where (
                stokHareket1.StokId == stokHareket2.StokId
                )
                select new
                {
                    result = stokHareket1.StokId
                };
Run Code Online (Sandbox Code Playgroud)

在第一个项目中,EF版本是:5.0.0,第二个项目是6.1.3

它给出了第一个项目:

SELECT 
[Extent1].[StokId] AS [StokId]
FROM  [dbo].[StokHareket] AS [Extent1]
INNER JOIN [dbo].[StokHareket] AS [Extent2] ON [Extent1].[StokId] = [Extent2].[StokId]
WHERE [Extent1].[StokId] IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

在第二个:

SELECT 
[Extent1].[StokId] AS [StokId]
FROM  [dbo].[StokHareket] AS [Extent1]
INNER JOIN [dbo].[StokHareket] AS [Extent2] ON ([Extent1].[StokId] = [Extent2].[StokId])   
/*THIS LINE*/OR (([Extent1].[StokId] IS NULL) AND ([Extent2].[StokId] IS NULL)) 
WHERE [Extent1].[StokId] IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

/*THIS LINE*/ 是不同的

这种差异可能是什么原因?

为了更好地可视化,这里是屏幕截图:

在db,stokHareket表中

在此输入图像描述

在Edmx:

在此输入图像描述

D S*_*ley 5

这似乎是EF6中引入的变化(可能更早;我没有找到确凿的证据).EF6开始将null == nullSQL 空值比较规则(是真的)注入SQL查询,除非您将UseDatabaseNullSemantics上下文配置的属性设置为true:

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

在任何情况下,它都不会影响您的结果 - 该WHERE子句将过滤掉任何StokIdnull的记录.