Schreiben rekursiver CTE unter Verwendung von Entity Framework Fluent Syntax oder Inline -SyntaxC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Schreiben rekursiver CTE unter Verwendung von Entity Framework Fluent Syntax oder Inline -Syntax

Post by Anonymous »

Ich bin neu in dieser Rekursion sowohl in SQL als auch im Entity -Framework (Ado.Net Entity Mapping). Ich arbeite an einem Kommentarmanagement, in dem ich eine Kommentar habe und die Tabelle Spalten NewSID, Kommentar, ParentCompmentId, IndentLevel, CreatedTime enthält. < /p>

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>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post