【问题标题】:Incorrect SQL generation on query查询时生成不正确的 SQL
【发布时间】:2018-09-07 07:45:06
【问题描述】:
Dim records = From record In db.table
              Where record.Level = "Level 1"
              Where record.NewNumber IsNot Nothing
              Select record.Number

当我调用 records.ToString() 时,我会得到如下输出:

选择 [Extent1].[Number] AS [Number] FROM [dbo].[table] AS [Extent1] WHERE [Extent1].[Level] = @p__linq__0

NewNumber is not null 的 where 子句缺失。如果我将 linq 更改为 NewNumber 什么都不是,我会得到以下信息:

选择 CAST(NULL AS varchar(1)) AS [C1] 从(选择 1 作为 X)作为 [SingleRowTable1] 其中 1 = 0

这里发生了什么? number 字段是我的主键,newnumber 只是另一个字段。我只更改了这篇文章的一些名称/值。使用 And/AndAlso 在同一行执行两个 where 子句没有区别。

NewNumber 字段就是这样配置的。

[属性](Function(x) x.NewNumber).HasMaxLength(20).HasColumnName("Newnumber").IsOptional()

【问题讨论】:

  • AndAlso 而不是第二个 Where ?
  • 遗憾的是没有区别。

标签: vb.net entity-framework-6


【解决方案1】:

EF 知道 NewNumber 不能是 null/nothing 并且要么忽略谓词 (IsNot Nothing),因为它始终为真,要么当它始终为假 (Is Nothing) 时,它会将其变成某种东西这更容易为查询优化器评估。

【讨论】:

  • Newnumber 是一个可以为空的 nvarchar(20) 所以它不应该像这样优化。
  • 嗯,EF 不知道它可以为空。它可能已根据需要进行映射。
  • 我在发布后也有同样的想法,并明确将其标记为可选,并且没有更改 SQL。它在描述中说默认情况下字符串属性可以为空。
  • 只是为了排除奇怪的情况:您确实将配置类添加到模型构建器,对吗?
  • 从 EF 的角度来看,该字段绝对是必需的。 OP必须找到原因。由于string默认是可选的,要么数据类型不同,要么字段为FK,需要关系等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2016-05-30
  • 2012-12-26
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多