2016-04-30 198 views
1

我有一张表可以在n级别添加记录,这意味着我可以评论它是在评论的第n级回复。动态选择儿童记录

我的问题是,如何使用linq动态选择n级注释?

例如,我想要评论回复第5级或第2或第n。

这里是我的表

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; } 
} 

到现在我使用LINQ和调用SQL服务器此功能让所有的孩子:

[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服务器:

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”的字段并在该字段中添加回复级别会更好。

但是,如果你想使用相同的结构,并要管理那么下面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

动态获取儿童,你必须使用嵌套循环(可能是递归函数),并得到所有的儿童,如获得第一级检查,如果它有第二级和第二级检查它是否有第三级..等 – Sachin

+0

谢谢我试试看看会发生什么 – nader