Baumtiefe ich die folgenden selbst verweisende Tabelle für ein Kind categroy, sagenstring.split in Einheit mit
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; }
}
hier String navpath enthält alle führend Eltern zu durchqueren:
"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....
Nun möchte ich gemäß diesem Szenario auf den Flattend-Baum für weitere Verarbeitung für eine bestimmte Tiefe nur sagen, Ebene 2 oder bis Ebene 4 Tiefe der Kinder mit Navpath verbunden.
meine Idee dieses Problem in Bezug war mit Linq auf diese Weise zu nähern ef:
var catTrees = db.products_category.Where(pc => pc.navpath.Split('-').Length < 4).ToList();
i den folgenden Link bin mit weiterer Verfahrgeschwindigkeit und Baum Generation zu tun: https://bitlush.com/blog/recursive-hierarchical-joins-in-c-sharp-and-linq
und es tut Eine großartige Arbeit bis jetzt, das einzige Problem ist, dass ich nicht die gesamte Tabelle für die Verarbeitung vorwählen möchte. Ich möchte Paging und ein gewisses Maß an Tiefe für die erste Iteration erreichen, so dass ich die Leistung im Falle von tausend von Aufzeichnungen aufrechterhalten kann. [Betrachten Sie dies als Kategoriehierarchie oder Blog-/Youtube-Kommentarhierarchie].
aber den oben ef Linq Befehl gibt den folgenden Fehler:
The LINQ expression node type 'ArrayLength' is not supported in LINQ to Entities.
i mit ef-Dokumenten und anderen Orten in SO vergewisserte, dass string.split zu wissen implizit mit EF nicht funktioniert. aber können wir es mit Erweiterungsmethoden anwenden, oder kann diese Baumauswahl einen alternativen Ansatz haben, ohne string.split zu verwenden und nur DBs zu treffen? bitte beraten.
Überprüfung Ihren Vorschlag – Alok
kein Glück DbExpressionBinding erfordert einen Eingangsausdruck mit einer Sammlung Result. – Alok
ok, war einen Schuss wert ,. Aber hier ist eine Lösung, die immer funktioniert. –