Ich versuche, eine Liste von Kommentaren für einen bestimmten Nachrichten zu erhalten, in dem alle Kommentare gemäß dem Kind unter Eltern angeordnet sind und Zeit erstellt haben, wie unten gezeigt: < /p>
Code: Select all
CommentID | time | ParentCommentID
Guid1 | t1 | null
Guid4 | t4 | Guid1
Guid2 | t2 | null
Guid3 | t3 | Guid2
< /code>
Die Priorität muss der Kinderbeziehung und dann der erstellten Zeit vorgegeben werden. < /p>
Was ich bisher beugt habe (aus Internetressourcen und vorheriger Stackoverflow Q /A) < /p>
Wie dargestellt, dass diese rekursiven Abfragen langsam sind. Und dies mit dem Entity -Framework ist noch langsamer. Es kann jedoch erreicht werden. Eine andere Sache ist die Verwendung von Linq im Entitäts -Framework.WITH cte_name ( column_name [,...n] )
AS
(
CTE_query_definition –- Anchor member is defined.
UNION ALL
CTE_query_definition –- Recursive member is defined referencing cte_name.
)
-- Statement using the CTE
SELECT *
FROM cte_name
Aber vor dem Versuch möchte ich das Linq. /> Aber ich habe versucht, den Code zu verstehen, aber vergebens. Kann mir jemand eine bessere und detaillierte Erklärung über das Schreiben rekursiver CTE im Entitätsgerüst geben? < /P>
private IEnumerable ArrangeComments(IEnumerable commentsList, string parentNewsComntID, int level)
{
Guid parentNewsCommentID;
if (parentNewsComntID != null)
{
parentNewsCommentID = new Guid(parentNewsComntID);
}
else
parentNewsCommentID = Guid.Empty;
return commentsList.Where(x => x.ParentCommentID == parentNewsCommentID).SelectMany(x => new[] { x }.Concat(ArrangeComments(commentsList, x.NewsCommentID.ToString(), level + 1));
}
< /code>
Und ich verwende dies wie unten in einer Methode: < /p>
return ArrangeComments(commentList,null , 0);
< /code>
Ich habe sie ausprobiert und es scheint, ich komme nirgendwo hin. Obwohl es Erklärungen zur SQL -Rekursion gibt, gibt es weniger Beispiele für LINQ und sind für mich aufgrund weniger Vertrautheit vage. Kann mir jemand helfen, diese CTE -Rekursion in Linq zu verstehen, das großartig ist < /p>
Danke im Voraus < /p < /p>