Vb.net 查询时生成的SQL不正确
当我调用records.ToString时,我得到如下输出: 挑选 [Extent1].[Number]作为[Number] 从[dbo].[table]到[Extent1] 其中[Extent1].[Level]=@p\u linq\u 0 缺少NewNumber is not null的where子句。如果我将linq更改为where NewNumber为nothing,则会得到以下结果: 挑选 CASTNULL作为varchar1作为[C1] 从中选择1作为X作为[SingleRowTable1] 其中1=0 这是怎么回事?number字段是我的主键,newnumber只是另一个字段。我只更改了这篇文章的一些名称/值。使用And/AndAlso在同一行执行两个where子句没有区别 字段NewNumber的配置如下所示 [Property]Functionx.NewNumber.HasMaxLength20.HasColumnNameNewnumber.IsOptionalVb.net 查询时生成的SQL不正确,vb.net,entity-framework-6,Vb.net,Entity Framework 6,当我调用records.ToString时,我得到如下输出: 挑选 [Extent1].[Number]作为[Number] 从[dbo].[table]到[Extent1] 其中[Extent1].[Level]=@p\u linq\u 0 缺少NewNumber is not null的where子句。如果我将linq更改为where NewNumber为nothing,则会得到以下结果: 挑选 CASTNULL作为varchar1作为[C1] 从中选择1作为X作为[SingleRowTab
EF知道NewNumber不能为null/nothing,或者忽略谓词IsNothing,因为它总是true,或者当它始终为false时,它会使查询优化器更容易对其进行计算。AndAlso而不是第二个Where?不幸的是,没有区别。Newnumber是一个可空的nvarchar20,因此它不应该像这样进行优化。恩,EF不知道它可空。它可能是根据需要映射的,我在发布之后也这么认为,并明确地将它标记为可选的,而不改变SQL。描述中说字符串属性默认为空。为了排除这种奇怪的情况:您确实向modelBuilder添加了配置类,是吗?从EF的角度来看,该字段肯定是必需的。OP必须找到原因。由于默认情况下字符串是可选的,因此数据类型不同,或者字段为FK,表示所需的关系等。
Dim records = From record In db.table
Where record.Level = "Level 1"
Where record.NewNumber IsNot Nothing
Select record.Number