【发布时间】:2017-02-11 20:14:30
【问题描述】:
我有以下自引用表
public partial class products_category
{
public long id { get; set; }
public string category_name { get; set; }
public string category_description { get; set; }
//self referencing to table id
public Nullable<long> Parent_Id { get; set; }
public string navPath {get; set; }
}
这里的字符串 navpath 包含子类别的所有主要父母,例如:
"Clothes" = 1 Parent_id=null, navpath=""
"Silk" = 2 Parent_id=1 navpath="1"
"Silk Suit"=3 parent_id=2 navpath="1-2"
"Saree" =4 parent_id=3 navpath="1-2-3"
"Dress Material"=5 parent_id=1 navpath="1" and so on....
现在根据这种情况,我想访问 flattend 树以对特定深度进行进一步处理,仅说与 navpath 关联的子级的第 2 级或第 4 级深度。
我对这个问题的想法是通过这种方式使用 linq to ef:
var catTrees = db.products_category.Where(pc => pc.navpath.Split('-').Length < 4).ToList();
我正在使用以下链接进行进一步的遍历和树生成: https://bitlush.com/blog/recursive-hierarchical-joins-in-c-sharp-and-linq
到目前为止它做得很好,唯一的问题是我不想预先选择整个表进行处理。我想为第一次迭代实现分页和一定程度的深度,这样我就可以在数千条记录的情况下保持性能。 [将其视为类别层次结构或博客/youtube cmets 层次结构]。
但是使用上面的 ef linq 命令会出现以下错误:
The LINQ expression node type 'ArrayLength' is not supported in LINQ to Entities.
我检查了 ef 文档和 SO 中的其他地方,知道 string.split 不能隐式地与 EF 一起使用。但是我们可以使用扩展方法应用它,或者这个树选择是否可以有替代方法而不使用 string.split 并点击 DB only? 请指教。
【问题讨论】:
标签: c# sql entity-framework linq tree