LinQ to SQL忽略虚拟属性上的!= null

本文关键字:null 属性 虚拟 to SQL LinQ | 更新日期: 2023-09-27 18:03:28

我已经用EF使用LinQ to SQL有一段时间了,只是偶然发现了一些奇怪的行为,希望有人能给我解释一下。

我正在对数据库上下文执行LinQ查询,该上下文具有相关实体的虚拟属性的POCO实体。我使用where子句来消除该实体为空的实例。我正在使用延迟加载。

return this.runtimeContext.FatalExceptionLogs.Where(l => l.RuntimeToDesignJuicerRelationship != null);

我发现的是,当我的查询被评估LinQ到SQL似乎完全忽略了我的条件,虚拟属性是空的,好像我从来没有包括这个检查。相反,它返回dbset中名为FatalExceptionLogs的所有记录。

现在我有一个简单的解决方法,首先使用。tolist()将数据加载到内存中,然后使用

如下所示:

return this.runtimeContext.FatalExceptionLogs.ToList().Where(l => l.RuntimeToDesignJuicerRelationship != null);

现在在内存中执行检查,并且返回所有虚拟属性为空的实例(因为没有相应的记录,因为用于连接的id是空的),我们都很好。

我也考虑过:

  • 检查连接的id是否为null,但不幸的是,我不能保证表的引用完整性得到了维护,因为没有应用外键。

  • 检查其他表中是否有匹配id的记录,但这可能会相当低效

所以我有一种工作方式,但我真的很想了解为什么LinQ到Sql是这样做的,还有什么其他的选择,有人能帮助吗?

完整的代码,如果它有帮助,在下面,虽然我已经削减它为这个例子:

查询:

return this.runtimeContext.FatalExceptionLogs.ToList().Where(l => l.RuntimeToDesignJuicerRelationship != null);
实体:

public class FatalExceptionLog
{
    public int Id { get; set; }
    public int? RuntimeJuicerId { get; set; }
    public virtual RuntimeToDesignJuicerRelationship RuntimeToDesignJuicerRelationship { get; set; }
}

映射:

public class FatalExceptionLogMap : EntityTypeConfiguration<FatalExceptionLog>
{
    public FatalExceptionLogMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);
        // Table & Column Mappings
        this.ToTable("FatalExceptionLogging");
        this.Property(t => t.RuntimeJuicerId).HasColumnName("JuicerLiveID");
        this.HasRequired(t => t.RuntimeToDesignJuicerRelationship)
            .WithMany(t => t.FatalExceptionLogs)
            .HasForeignKey(t => t.RuntimeJuicerId);
    }
}

LinQ to SQL忽略虚拟属性上的!= null

为什么不直接进行正常的连接呢?

return this.runtimeContext.FatalExceptionLogs.Where(
                    l => runtimeContext.RuntimeJuicers.Any(
                                    y => y.RuntimeJuicerId == l.RuntimeJuicerId
                                                            )
                                                    );