我成功地在实体框架中使用自引用表。
但我不知道如何获得所需深度的记录?
这应该是什么逻辑?
Model :
public class FamilyLabel
{
public FamilyLabel()
{
this.Children = new Collection<FamilyLabel>();
this.Families = new Collection<Family>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FamilyLabelId { get; set; }
public string FamilyLabelName { get; set; }
public virtual FamilyLabel Parent { get; set; }
public int JamaatId { get; set; }
public virtual Jamaat Jamaat { get; set; }
public virtual ICollection<Family> Families { get; set; }
public virtual ICollection<FamilyLabel> Children { get; set; }
}
理论上,您可以创建一个根据指定深度级别动态构建查询表达式的方法:
context.FamilyLabels.Where(x =>
x.Parent. ... .Parent != null &&
x.Parent.Parent ... .Parent == null);
下面的实现可以解决这个问题:
public static IList<FamilyLabel> Get(DbConnection connection, int depth)
{
var p = Expression.Parameter(typeof(FamilyLabel));
Expression current = p;
for (int i = 0; i < deep; i++)
{
current = Expression.Property(current, "Parent");
}
var nullConst = Expression.Constant(null, typeof(FamilyLabel));
var predicate = Expression.Lambda<Func<FamilyLabel, bool>>(
Expression.AndAlso(
Expression.NotEqual(current, nullConst),
Expression.Equal(Expression.Property(current, "Parent"), nullConst)), p);
using (MyDbContext context = new MyDbContext(connection))
{
return context.FamilyLabels.Where(predicate).ToList();
}
}
然而,这可能会创建一堆连接表达式,所以这可能不是最好的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)