2012-02-17 22 views
1

I持って、次のDataObject:そうLINQ - 再帰的な要求

Messages: 
MessageID int, 
Text string, 
ParentMessageID int? 

、レコードのように:

1 | "テキスト1" |ヌル 2 | "テキスト1に返信" | 1 3 | "テキスト1への返信に返信" | 2

...

私は1つのスレッドでどのように多くのメッセージを計算する必要があります。どのようにLINQでそれを行うには?

+0

あなたはそうではありません。再帰を使用します。 "仕事のための正しいツール..." –

+0

何を試しましたか? – rene

答えて

2

LINQ to Entitiesを使用することはできません。SQLを使用して再帰的クエリを実行するには、共通のテーブル式を記述する必要があります。これらはかなり遅いことが多いです。

常に階層内の同じレベルから数えたい場合、最も簡単な解決策は、このようにルートIDのプロパティを追加することです。

Messages: 
MessageID int, 
Text string, 
ParentMessageID int? 
ThreadRootID int 

スレッドルートは、特定のスレッド内のすべてのメッセージで同じです。 ThreadRootIdのものを数えるのは簡単です(再帰的なクエリよりはるかに性能が良いでしょう)。

+0

私はそれについて考えましたが、それはデータの冗長性です – John

+0

はい、しかし冗長性は時々良いことです;-) –

1

LINQ for EFで行うことはできません。ストアドプロシージャを記述し、それをEFモデルのあるメソッドにマップする方がよいでしょう。