2013-03-28 34 views
5

Tôi đang cố gắng liệt kê một số loại (mối quan hệ con mẹ) và tôi có lệnh sau để chỉ liệt kê danh mục mẹEF Mã đầu tiên so sánh các giá trị null tạo truy vấn lạ

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

Nhưng truy vấn sql tạo ra bởi EF không trả lại bất cứ điều gì truy vấn

sql tạo ra bởi EF

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 

loại mô hình

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

Mapping

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); 
    } 
} 
+0

@caerolus có EF tạo mà –

+0

Sử dụng '(c =>! C.ParentId.HasValue)' – Fendy

+0

@Fendy tạo ra cùng một truy vấn –

Trả lời

0

Tôi gửi bài này như một câu trả lời vì chắc chắn một trong những sẽ làm việc:

tài sản ParentId của bạn cần phải được public virtual - cố gắng thay đổi điều đó đầu tiên.

Sau đó, hãy thử context.Categories.Where(c => !c.ParentId.HasValue)

Sau đó, hãy thử context.Categories.Where(c => c.Parent == null)

tôi có các ứng dụng nơi trên hoạt động tốt.

Sau đó, hãy thử context.Categories.Where(c => object.Equals(c.Parent, null))

Đó cuối cùng là một bit of a hack from someone at MS, nhưng dường như phải làm việc.

Các vấn đề liên quan