我有一个Comment表,其中有一个CommentID和ParentCommentID。我正在尝试获取评论的所有子级的列表。到目前为止,这是我到目前为止尚未完成的测试。
private List<int> searchedCommentIDs = new List<int>(); // searchedCommentIDs is a list of already yielded comments stored // so that malformed data does not result in an infinite loop. public IEnumerable<Comment> GetReplies(int commentID) { var db = new DataClassesDataContext(); var replies = db.Comments .Where(c => c.ParentCommentID == commentID && !searchedCommentIDs.Contains(commentID)); foreach (Comment reply in replies) { searchedCommentIDs.Add(CommentID); yield return reply; // yield return GetReplies(reply.CommentID)); // type mis-match. foreach (Comment replyReply in GetReplies(reply.CommentID)) { yield return replyReply; } } }
2个问题:
IEnumerable <Comment>
<Comment>``Comment
我可能会使用UDF / CTE或(对于非常深的结构)使用手动执行相同操作的存储过程。
请注意,如果您可以更改架构,则可以将此类递归结构预先索引到索引树/范围树中,该树使您可以执行单个BETWEEN查询- 但树的维护成本很高(即查询变得便宜,但是插入/更新/删除变得昂贵,或者您需要延迟的计划任务)。
关于2-您只能yield使用枚举中指定的类型(Tin IEnumerable<T>/ IEnumerator<T>)。
yield
T
IEnumerable<T>
IEnumerator<T>
你可以yield的IEnumerable<Comment> ,如果 该方法返回IEnumerable<IEnumerable<Comment>>-这是否合理?
IEnumerable<Comment>
IEnumerable<IEnumerable<Comment>>
改进之处:
using
DataContext
IDisposable
所以:
using(var db = new MyDataContext() ) { /* existing code */ }