c# - EF Code First 比较空值会生成奇怪的查询

标签 c# linq entity-framework ef-code-first

我正在尝试列出一些类别(父子关系)并且我有以下命令仅列出父类别

context.Categories.Where(c => c.ParentId == null)

但是EF生成的sql查询没有返回任何内容

EF生成的sql查询

SELECT 
CAST(NULL AS int) AS [C1], 
CAST(NULL AS varchar(1)) AS [C2], 
CAST(NULL AS bit) AS [C3], 
CAST(NULL AS int) AS [C4]
FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]
WHERE 1 = 0

类别模型

public class Category
{
  public int Id { get; set; }
  public string Name { get; set; }
  public bool IsActive { get; set; }
  public virtual IList<Category> SubCategories { get; set; }
  internal int? ParentId { get; set; }
  public virtual Category Parent { get; set; }

  public override bool Equals(object obj)
  {
    var categoryToCompare = obj as Category;
    if (categoryToCompare == null) return false;

    return categoryToCompare.Id == Id;
  }

  public override int GetHashCode()
  {
    return Id.GetHashCode();
  }
}

映射

public class CategoryConfiguration : EntityTypeConfiguration<Category>
{
  public CategoryConfiguration()
  {
    ToTable("tbl_category");
    HasKey(c => c.Id);
    Property(c => c.Id).HasColumnName("cd_category");
    Property(c => c.Name).HasColumnName("ds_category");
    Property(c => c.IsActive).HasColumnName("fl_active");
    Property(c => c.ParentId).HasColumnName("cd_base_category").IsOptional();
    HasMany(c => c.SubCategories).WithRequired(c => c.Parent).HasForeignKey(c => c.ParentId);
  }
}

最佳答案

我将此作为答案发布,因为肯定其中之一会起作用:

您的 ParentId 属性需要是 public virtual - 首先尝试更改它。

然后,尝试 context.Categories.Where(c => !c.ParentId.HasValue)

然后,尝试 context.Categories.Where(c => c.Parent == null)

我的应用程序可以正常运行上述内容。

然后,尝试 context.Categories.Where(c => object.Equals(c.Parent, null))

最后一个是 bit of a hack from someone at MS ,但显然应该有效。

关于c# - EF Code First 比较空值会生成奇怪的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15692788/

相关文章:

c# - 在 C# 中的新行上用分号拆分字符串

c# - 单步执行 Linq 语句提示

sql - 如何让 EF 使用实体作为导入存储过程的参数?

c# - 使用 EF 模型从字符串字段中存储和检索枚举的无缝方式

c# - 可以在 SQL 数据库中进行二进制搜索吗?

c# - SetWindowsHookEx with WH_MOUSE_LL 减慢鼠标几秒钟

c# - 如何在 WPF 中为 Viewport3D 控件切换到线框显示模式?

c# - 如何列出请求用户在 WCF 服务中的角色?

database - 用编辑过的记录检查原始数据库记录的问题

c# - 使用 Entity Framework Code First 和 Fluent API 配置许多一对一关系