【问题标题】:same linq query generate different sql in different projects相同的 linq 查询在不同的项目中生成不同的 sql
【发布时间】:2015-05-20 06:12:33
【问题描述】:

查询是:

        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
                };

在第一个项目中 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

第二个:

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

/*THIS LINE*/ 不同

造成这种差异的原因是什么?

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

在数据库中,stokHareket 表

在 Edmx 中:

【问题讨论】:

  • StokId 在其中一个项目中是否可以为空?您引用的 EF 版本是否相同?
  • 在 db 中允许检查 null,但在 edmx 中可以为 null(无)
  • 这种情况在某个时候发生了变化吗?您可以尝试在 EDMX 中手动将可空属性设置为 True。在任何一种情况下,它都不会改变您的结果,因为 WHERE 子句将排除任何空 ID。
  • 在第一个项目 EF 版本是:5.0.0,在第二个项目中:6.1.3
  • setting the nullable property to True in the EDMX 没有改变任何东西

标签: c# linq entity-framework


【解决方案1】:

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

public class MyContext : DbContext
{
    public MyContext()
    {
        this.Configuration.UseDatabaseNullSemantics = true;
    }
}

在任何情况下,它都不会影响您的结果 - WHERE 子句会过滤掉所有 StokId 为空的记录。

【讨论】:

  • 它会影响结果,我不想将结果stokId 包含为空。您的建议给出的结果与以前的 EF 版本相同。谢谢
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多