2016-04-30 22 views
1

私はnレベルのレコードを追加できるコメントのテーブルを持っています。これは、コメントのn番目のレベルのコメントであることを意味します。子供のレコードの動的選択

私の問題は、linqを使ってどのようにnレベルのコメントを動的に選択できますか?

たとえば、5レベルまたは2番目またはn番目のコメント返信が必要です。

[DbFunction("Ents", "cmTree")] 
    public virtual IQueryable<ContentComment> cmTree(string topLevelComments) 
    { 
     var topLevelCommentsParameter = topLevelComments != null ? 
      new ObjectParameter("topLevelComments", topLevelComments) : 
      new ObjectParameter("topLevelComments", typeof(string)); 

     return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<ContentComment>("[Entities].[cmTree](@topLevelComments)", topLevelCommentsParameter); 
    } 

し、SQLサーバーに:今私は、LINQを使用し、すべての子を取得するには、SQLサーバでこの関数を呼び出すまで、ここで

は私のテーブル

public partial class { 

public Comment() 
{ 
    this.Comments1 = new HashSet<Comment>(); 
} 

public int CommentId { get; set; } 
public Nullable<int> ParentId { get; set; } 
public string Title { get; set; } 

public virtual ICollection<Comment> Comments1 { get; set; } 
public virtual Comment Comment1 { get; set; } 
} 

ある

ALTER FUNCTION [dbo].[cmTree] 
(
-- Table types seems goods here. 
-- but in application-level, linq to sql technology dose not support table types. 
-- TupleValue type can user for future use. 
    @topLevelComments NVARCHAR(max) 

) 
RETURNS @resultTable TABLE (
[Id] [bigint] primary KEY NOT NULL, 
[AuthorUserId] [int] NULL, 
[AuthorName] [nvarchar](128) NULL, 
[AuthorEmail] [nvarchar](256) NULL, 
[AuthorUrl] [nvarchar](512) NULL, 
[AuthorIp] [nvarchar](100) NULL, 
[InsertDateTime] [datetime] NOT NULL, 
[BodyContent] [nvarchar](max) NOT NULL, 
[IsApproved] [bit] NOT NULL, 
[IsAlertable] [bit] NOT NULL, 
[ContentId] [bigint] NOT NULL, 
[ParentCommentId] [bigint] NULL, 
[VerifierUserID] [int] NULL, 
[VerifyDateTime] [datetime] NULL, 
[Status] [bit] NOT NULL, 
[LastModifierUserId] [int] NULL, 
[LastModifiedDateTime] [datetime] NULL 
) 

AS 
BEGIN 
with CommentTableExpression As (

-- Anchor entities 
select rC.Id, rc.AuthorUserId, rc.AuthorName, rc.[AuthorEmail], rc.[AuthorUrl], rc.[AuthorIp], rc.[InsertDateTime], rc.[BodyContent], rc.[IsApproved], rc.[IsAlertable], rc.[ContentId], rc.[ParentCommentId], rc.[VerifierUserID], rc.[VerifyDateTime], rc.[Status], rc.[LastModifierUserId], rc.[LastModifiedDateTime] 
from dbo.ContentComments as rC 
WHERE rc.ParentCommentId IN (SELECT * FROM dbo.CSVToTable(@topLevelComments)) 

union all 

-- Recursive query execution 
select child.Id, child.AuthorUserId, child.AuthorName, child.[AuthorEmail], child.[AuthorUrl], child.[AuthorIp], child.[InsertDateTime], child.[BodyContent], child.[IsApproved], child.[IsAlertable], child.[ContentId], child.[ParentCommentId], child.[VerifierUserID], child.[VerifyDateTime], child.[Status], child.[LastModifierUserId], child.[LastModifiedDateTime] 

from dbo.ContentComments as child 
inner join CommentTableExpression as t_Comment 
on child.ParentCommentId = t_Comment.Id 
where child.ParentCommentId is not NULL) -- commente contet=nt budan barasi shavad. 

INSERT @resultTable Select * from CommentTableExpression 

RETURN 
END 

助けていただければ幸いです。

+1

を取得します、あなたがしようとしているコードを入力してください。 –

+0

@ Cubicle.Jockey私の質問 – nader

答えて

1

"ChildLevel"というテーブルでもう1つのフィールドを管理し、そのフィールドに返信レベルを追加する方がよいでしょう。

しかし、あなたは同じ構造を使用したいとLINQの下に、次に管理する場合は5レベルの子どもたちに

var rec = dt.Comments().Where(t => t.Comment1 != null 
       && t.Comment1.Comment1 != null 
       && t.Comment1.Comment1.Comment1 != null 
       && t.Comment1.Comment1.Comment1.Comment1 != null); 
+0

ありがとうしかし、これは静的な方法ですこれを達成する。私は動的に子どもを生成したい。私は動的にLinq式を生成できますか? – nader

+0

動的に子を取得するためには、ネストされたループ(再帰関数による可能性があります)を使用し、すべての子を取得する必要があります。第2レベルがある場合は第1レベルのチェックを受け取り、第3レベルを持つ場合は2レベルのチェックを受けます。 – Sachin

+0

ありがとう私はそれを試して何が起こるか見る – nader

関連する問題