これは、の再帰で、SQLとEntity Framework(ADO.NETエンティティマッピング)の両方で再帰です。私はComments
テーブルがあり、テーブルが列NewsID, CommentID, ParentCommentID, IndentLevel, CreatedTime
が含まれているコメントの管理に取り組んでいます。以下に示すように、私は、すべてのコメントは、親の下の子供に応じて配置されたときに作成され、特定のニュース項目のコメントの一覧を取得しようとしていますEntity Frameworkを使用した再帰CTEの作成Fluent構文またはインライン構文
:
CommentID | time | ParentCommentID
Guid1 | t1 | null
Guid4 | t4 | Guid1
Guid2 | t2 | null
Guid3 | t3 | Guid2
優先順位を指定する必要があり子の親の関係に、次に作成された時間に割り当てられます。私は(インターネットリソースと前回のstackoverflowのQ/Aから)これまでに
- ようにされて身を乗り出してきた何
は、これらの再帰クエリが遅い示します。 Entity Frameworkを使用してこれを行うことはさらに遅くなります。しかし、それは達成することができます。
- だから、これはSQL Serverでストアドプロシージャを作成し、機能的なインポートを使用して、それを呼び出すことによって行うことができます。もう一つはEntity FrameworkでLinqを使用しています。
- SQL Serverのでは、それがこの形式で
を使用しているSQL:
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
- しかし、これをしようとする前に、私は、LINQのを試してみたいです。私はアイデアを持っている。このリンクに参照のうえいる。このため
: https://stackoverflow.com/a/6225373/892788
しかし、私はコードが、無駄で理解しようとしてきました。誰かがEntity Frameworkで再帰的なCTEを書くことについて、より詳細な説明を教えてくれますか?
private IEnumerable<NewsComment> ArrangeComments(IEnumerable<NewsComment> 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));
}
そして、私はメソッド内で、この次のように使用しています:
return ArrangeComments(commentList,null , 0);
私はそれらを試してみましたが、私がどこにもなっていないのですようです。 SQLの再帰の説明がありますがそこLINQのためのあまり例があり、原因あまり馴染みに私のために曖昧です。誰かが私はLINQでもEFで再帰CTEのためのサポートがない私の知る限り、事前
CTEは、 "共通テーブル式" の略で、LINQとは何の関係もありません。 –
Ok Serg Rogovtsev。私は私の質問を編集します。 –