我有一个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>
提供给IEnumerable <Comment>
,只能Comment
本身?答案 0 :(得分:4)
我可能会使用UDF / CTE,或者(对于非常深的结构)手动执行相同操作的存储过程。
请注意,如果您可以更改架构,则可以将此类递归结构预先索引到索引/范围树中,该树允许您执行单个BETWEEN查询 - 但树的维护很昂贵(即查询变得便宜,但是插入/更新/删除变得昂贵,或者您需要延迟计划任务。)
Re 2 - 您只能yield
枚举中指定的类型(T
/ IEnumerable<T>
中的IEnumerator<T>
)。
你可以yield
IEnumerable<Comment>
,如果方法返回IEnumerable<IEnumerable<Comment>>
- 这有意义吗?
改进:
using
,因为DataContext
是IDisposable
... 这样:
using(var db = new MyDataContext() ) { /* existing code */ }