我想返回父类别和子类别。在我的桌子上有一个自我加入。这是我的班级:
public partial class CategoryMaster
{
public int Id { get; set; }
public string Name { get; set; }
public Nullable<int> ParentId { get; set; }//parentid is link to Id
public virtual ICollection<CategoryMaster> CategoryMaster1 { get; set; }
public virtual CategoryMaster CategoryMaster2 { get; set; }
}
我使用此查询返回父类别和子类别:
var GetallCategories = context.CategoryMaster.Include("CategoryMaster1")
.Where(d => d.ParentId == null)
.OrderBy(d => d.Name)
.Select(d => new SelectListItem { Text = d.Name,
Value = d.Id.ToString()
})
.ToList();
问题是它只是返回父类别。我的查询有什么问题?
答案 0 :(得分:0)
第一个问题是你的where子句。你告诉它只能带回一个null父级的CategoryMasters。因此,您不会让任何孩子离开数据库。
我们在使用EF查询时会遵循更严格的(读取:更慢)模式,因此我从未完全按照您在此处所做的工作,但我认为您需要做的就是是移动where子句,如下所示:
var GetallCategories = context.CategoryMaster.Include("CategoryMaster1")
.OrderBy(d => d.Name)
.ToList();
.Where(d => d.ParentId == null)
.Select(d => new SelectListItem { Text = d.Name,
Value = d.Id.ToString()
})
ToList强制进行数据库调用,然后在从数据库返回后处理它之后进行处理,此时,它获取所有没有where子句的数据。如果我理解正确,你确实想要所有的数据,你只希望你的列表只包含顶层的父母,然后深入了解孩子。
因此,如果在tolist之前添加任何where子句,它将限制在DB甚至尝试构建对象层次结构之前从DB返回的内容。如果你看一下EF生成的实际sql,你可以看到这个。这意味着,如果你合法地需要一个where子句 - 比如说你想带回所有姓氏为#34;史密斯&#34;加上他们的孩子 - 你必须让它变得更复杂。如果你需要一个有意义的地方来过滤DB中的父母(你可能是为了表现)而且你必须允许未知数目的孩子,这对于EF包含来说变得非常困难。