public void AsFlattenedEnumerable_AllowsEnumeratingAllPagesAsSingleEnumeration() { var pages = new Collection<IPagedCollection<string>>(); IPagedCollection<string> pageZero = new PagedCollection<string> { MaxItems = 8 }; pageZero.Add("zero"); pageZero.Add("one"); pageZero.Add("two"); pages.Add(pageZero); IPagedCollection<string> pageOne = new PagedCollection<string> { MaxItems = 8 }; pageOne.Add("three"); pageOne.Add("four"); pageOne.Add("five"); pages.Add(pageOne); IPagedCollection<string> pageTwo = new PagedCollection<string> { MaxItems = 8 }; pageTwo.Add("six"); pageTwo.Add("seven"); pages.Add(pageTwo); var book = new CollectionBook<string>((pageIndex, pageSize) => pages[pageIndex], 3); // act string concatenation = String.Join("", book.AsFlattenedEnumerable().ToArray()); // assert Assert.AreEqual("zeroonetwothreefourfivesixseven", concatenation); }
public void CollectionBook_WithThreePages_IteratesCorrectly() { var pages = new Collection <IPagedCollection <string> >(); IPagedCollection <string> pageZero = new PagedCollection <string> { MaxItems = 8 }; pageZero.Add("zero"); pageZero.Add("one"); pageZero.Add("two"); pages.Add(pageZero); IPagedCollection <string> pageOne = new PagedCollection <string> { MaxItems = 8 }; pageOne.Add("three"); pageOne.Add("four"); pageOne.Add("five"); pages.Add(pageOne); IPagedCollection <string> pageTwo = new PagedCollection <string> { MaxItems = 8 }; pageTwo.Add("six"); pageTwo.Add("seven"); pages.Add(pageTwo); var book = new CollectionBook <string>((pageIndex, pageSize) => pages[pageIndex], 3); string concatenation = string.Empty; int currentPageIndex = 0; // act foreach (var page in book) { concatenation += currentPageIndex; foreach (string item in page) { concatenation += item; } currentPageIndex++; } // assert Assert.AreEqual("0zeroonetwo1threefourfive2sixseven", concatenation); }
public void CanIteratePagedCollectionsInABook() { Collection<IPagedCollection<string>> pages = new Collection<IPagedCollection<string>>(); IPagedCollection<string> pageZero = new PagedCollection<string>(); pageZero.MaxItems = 8; pageZero.Add("zero"); pageZero.Add("one"); pageZero.Add("two"); pages.Add(pageZero); IPagedCollection<string> pageOne = new PagedCollection<string>(); pageOne.MaxItems = 8; pageOne.Add("three"); pageOne.Add("four"); pageOne.Add("five"); pages.Add(pageOne); IPagedCollection<string> pageTwo = new PagedCollection<string>(); pageTwo.MaxItems = 8; pageTwo.Add("six"); pageTwo.Add("seven"); pages.Add(pageTwo); CollectionBook<string> book = new CollectionBook<string>( delegate(int pageIndex, int pageSize) { return pages[pageIndex]; }, 3); string concatenation = string.Empty; int currentPageIndex = 0; foreach(IPagedCollection<string> page in book) { concatenation += currentPageIndex; foreach(string item in page) { concatenation += item; } currentPageIndex++; } Assert.AreEqual("0zeroonetwo1threefourfive2sixseven", concatenation, "We iterated correctly."); }
/// <summary> /// Gets a pageable collection of log entries. /// </summary> /// <param name="pageIndex">Index of the page.</param> /// <param name="pageSize">Size of the page.</param> /// <returns></returns> public override IPagedCollection<LogEntry> GetPagedLogEntries(int pageIndex, int pageSize) { IDataReader reader = DbProvider.Instance().GetPagedLogEntries(pageIndex, pageSize); IPagedCollection<LogEntry> entries = new PagedCollection<LogEntry>(); while(reader.Read()) { entries.Add(DataHelper.LoadLogEntry(reader)); } reader.NextResult(); entries.MaxItems = DataHelper.GetMaxItems(reader); return entries; }
public void CollectionBook_WithThreePages_IteratesCorrectly() { var pages = new Collection<IPagedCollection<string>>(); IPagedCollection<string> pageZero = new PagedCollection<string> {MaxItems = 8}; pageZero.Add("zero"); pageZero.Add("one"); pageZero.Add("two"); pages.Add(pageZero); IPagedCollection<string> pageOne = new PagedCollection<string> {MaxItems = 8}; pageOne.Add("three"); pageOne.Add("four"); pageOne.Add("five"); pages.Add(pageOne); IPagedCollection<string> pageTwo = new PagedCollection<string> {MaxItems = 8}; pageTwo.Add("six"); pageTwo.Add("seven"); pages.Add(pageTwo); var book = new CollectionBook<string>((pageIndex, pageSize) => pages[pageIndex], 3); string concatenation = string.Empty; int currentPageIndex = 0; // act foreach(var page in book) { concatenation += currentPageIndex; foreach(string item in page) { concatenation += item; } currentPageIndex++; } // assert Assert.AreEqual("0zeroonetwo1threefourfive2sixseven", concatenation); }
public void AsFlattenedEnumerable_AllowsEnumeratingAllPagesAsSingleEnumeration() { var pages = new Collection <IPagedCollection <string> >(); IPagedCollection <string> pageZero = new PagedCollection <string> { MaxItems = 8 }; pageZero.Add("zero"); pageZero.Add("one"); pageZero.Add("two"); pages.Add(pageZero); IPagedCollection <string> pageOne = new PagedCollection <string> { MaxItems = 8 }; pageOne.Add("three"); pageOne.Add("four"); pageOne.Add("five"); pages.Add(pageOne); IPagedCollection <string> pageTwo = new PagedCollection <string> { MaxItems = 8 }; pageTwo.Add("six"); pageTwo.Add("seven"); pages.Add(pageTwo); var book = new CollectionBook <string>((pageIndex, pageSize) => pages[pageIndex], 3); // act string concatenation = String.Join("", book.AsFlattenedEnumerable().ToArray()); // assert Assert.AreEqual("zeroonetwothreefourfivesixseven", concatenation); }
private PagedCollection <EntryStatsView> BuildFakeCollectionNotPublished() { var coll = new PagedCollection <EntryStatsView>(); coll.Add(new EntryStatsView() { Title = "My Post Title", EntryName = "this-is-the-title", IsActive = false, Blog = new Blog() { Title = "My Blog" } }); return(coll); }
private static IPagedCollection<Referrer> LoadPagedReferrersCollection(IDataReader reader) { try { IPagedCollection<Referrer> prc = new PagedCollection<Referrer>(); while (reader.Read()) { prc.Add(DataHelper.LoadReferrer(reader)); } reader.NextResult(); prc.MaxItems = DataHelper.GetMaxItems(reader); return prc; } finally { reader.Close(); } }
public void WritesProperBlogMl() { //Set up ids string blogId = "8675309"; string catOneId = "1"; string catTwoId = "2"; string postOneId = "100"; string postTwoId = "200"; string postThreeId = "300"; string commentOneId = "91"; string trackBackOneId = "92"; int pageSize = 2; #region Create a full instance of a blog in an object hierarchy DateTime dateCreated = DateTime.Now; BlogMLBlog blog = ObjectHydrator.CreateBlogInstance("the title", "the subtitle", "http://blog.example.com/", "phil", "*****@*****.**", dateCreated); BlogMLContext context = new BlogMLContext(blogId, false); IList<BlogMLCategory> categories = new Collection<BlogMLCategory>(); categories.Add(ObjectHydrator.CreateCategoryInstance(catOneId, "category1", "Category 1 is the first", true, null, dateCreated, dateCreated)); categories.Add(ObjectHydrator.CreateCategoryInstance(catTwoId, "category2", "Category 2 is the second", true, null, dateCreated, dateCreated)); IPagedCollection<BlogMLPost> firstPage = new PagedCollection<BlogMLPost>(); firstPage.Add(ObjectHydrator.CreatePostInstance(postOneId, "post title 1", "http://blog.example.com/post100/", true, "Nothing important 1", dateCreated, dateCreated)); firstPage[0].Categories.Add(catOneId); firstPage[0].Categories.Add(catTwoId); firstPage[0].Comments.Add(ObjectHydrator.CreateCommentInstance(commentOneId, "re: post", "http://blog.example.com/post100/#91", "You rock!", "*****@*****.**", "haacked", true, dateCreated, dateCreated)); firstPage[0].Trackbacks.Add(ObjectHydrator.CreateTrackBackInstance(trackBackOneId, "re: title", "http://another.example.com/", true, dateCreated, dateCreated)); firstPage.Add(ObjectHydrator.CreatePostInstance(postTwoId, "post title 2", "http://blog.example.com/post200/", true, "Nothing important 2", dateCreated, dateCreated)); firstPage.MaxItems = 3; IPagedCollection<BlogMLPost> secondPage = new PagedCollection<BlogMLPost>(); secondPage.Add(ObjectHydrator.CreatePostInstance(postThreeId, "post title 3", "http://blog.example.com/post300/", true, "Nothing important 3", dateCreated, dateCreated)); secondPage.MaxItems = 3; #endregion //Now setup expectations. MockRepository mocks = new MockRepository(); IBlogMLProvider provider = (IBlogMLProvider)mocks.CreateMock(typeof(IBlogMLProvider)); Expect.Call(provider.GetBlogMlContext()).Return(context); Expect.Call(provider.IdConversion).Return(IdConversionStrategy.Empty); Expect.Call(provider.GetBlog(blogId)).Return(blog); Expect.Call(provider.GetAllCategories(blogId)).Return(categories); Expect.Call(provider.PageSize).Return(pageSize); Expect.Call(provider.GetBlogPosts(blogId, 0, pageSize)).Return(firstPage); Expect.Call(provider.GetBlogPosts(blogId, 1, pageSize)).Return(secondPage); mocks.ReplayAll(); //TODO: simplify when BlogML bug is fixed. StringBuilder builder = new StringBuilder(); StringWriter stringWriter = new StringWriter(builder); XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter); BlogMLWriter writer = BlogMLWriter.Create(provider); writer.Write(xmlWriter); mocks.VerifyAll(); //Verify blog. XmlDocument doc = new XmlDocument(); doc.LoadXml(builder.ToString()); XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("bml", "http://www.blogml.com/2006/09/BlogML"); XmlNode blogNode = doc.SelectSingleNode("bml:blog", nsmgr); Assert.AreEqual("http://blog.example.com/", blogNode.Attributes["root-url"].InnerText, "The root url doesn't match."); XmlNodeList categoryNodes = doc.SelectNodes("bml:blog/bml:categories/bml:category", nsmgr); Assert.AreEqual(2, categoryNodes.Count, "Expected 2 categories"); XmlNodeList postNodes = doc.SelectNodes("bml:blog/bml:posts/bml:post", nsmgr); Assert.AreEqual(3, postNodes.Count, "Expected 3 posts"); XmlNodeList firstPostCategoryNodes = doc.SelectNodes("bml:blog/bml:posts/bml:post[@id='" + postOneId + "']/bml:categories/bml:category", nsmgr); Assert.AreEqual(2, firstPostCategoryNodes.Count, "Expected first post to have 2 categories"); XmlNodeList firstPostCommentsNodes = doc.SelectNodes("bml:blog/bml:posts/bml:post[@id='" + postOneId + "']/bml:comments/bml:comment", nsmgr); Assert.AreEqual(1, firstPostCommentsNodes.Count, "Expected first post to have 1 comment"); XmlNodeList firstPostTrackbackNodes = doc.SelectNodes("bml:blog/bml:posts/bml:post[@id='" + postOneId + "']/bml:trackbacks/bml:trackback", nsmgr); Assert.AreEqual(1, firstPostTrackbackNodes.Count, "Expected first post to have 1 trackback"); }
public void WritesProperBlogMlWithIdConversion(string firstPostConvertedId, string firstCategoryConvertedId, string firstCommentConvertedId, string firstTrackbackConvertedId, string secondPostConvertedId, string conversionType) { //Set up ids string blogId = "blah-abc-000"; string catOneId = "first-cat-id"; string catTwoId = "blah-acd"; string firstPostId = "first-post-id"; string secondPostId = "second-post-id"; string thirdPostId = "blah-blah"; string commentOneId = "first-comment-id"; string trackBackOneId = "first-trackback-id"; IdConversionStrategy conversion = IdConversionStrategy.Empty; switch(conversionType) { case "int": conversion = new IntConversionStrategy(); break; case "subtext": conversion = new SubtextConversionStrategy(); break; } int pageSize = 2; #region Create a full instance of a blog in an object hierarchy DateTime dateCreated = DateTime.Now; BlogMLBlog blog = ObjectHydrator.CreateBlogInstance("the title", "the subtitle", "http://blog.example.com/", "phil", "*****@*****.**", dateCreated); BlogMLContext context = new BlogMLContext(blogId, false); IList<BlogMLCategory> categories = new Collection<BlogMLCategory>(); categories.Add(ObjectHydrator.CreateCategoryInstance(catOneId, "category1", "Category 1 is the first", true, null, dateCreated, dateCreated)); categories.Add(ObjectHydrator.CreateCategoryInstance(catTwoId, "category2", "Category 2 is the second", true, null, dateCreated, dateCreated)); IPagedCollection<BlogMLPost> firstPage = new PagedCollection<BlogMLPost>(); firstPage.Add(ObjectHydrator.CreatePostInstance(firstPostId, "post title 1", "http://blog.example.com/post100/", true, "Nothing important 1", dateCreated, dateCreated)); firstPage[0].Categories.Add(catOneId); firstPage[0].Categories.Add(catTwoId); firstPage[0].Comments.Add(ObjectHydrator.CreateCommentInstance(commentOneId, "re: post", "http://blog.example.com/post100/#91", "You rock!", "*****@*****.**", "haacked", true, dateCreated, dateCreated)); firstPage[0].Trackbacks.Add(ObjectHydrator.CreateTrackBackInstance(trackBackOneId, "re: title", "http://another.example.com/", true, dateCreated, dateCreated)); firstPage.Add(ObjectHydrator.CreatePostInstance(secondPostId, "post title 2", "http://blog.example.com/post200/", true, "Nothing important 2", dateCreated, dateCreated)); firstPage.MaxItems = 3; IPagedCollection<BlogMLPost> secondPage = new PagedCollection<BlogMLPost>(); secondPage.Add(ObjectHydrator.CreatePostInstance(thirdPostId, "post title 3", "http://blog.example.com/post300/", true, "Nothing important 3", dateCreated, dateCreated)); secondPage.MaxItems = 3; #endregion //Now setup expectations. MockRepository mocks = new MockRepository(); IBlogMLProvider provider = (IBlogMLProvider)mocks.CreateMock(typeof(IBlogMLProvider)); Expect.Call(provider.GetBlogMlContext()).Return(context); Expect.Call(provider.IdConversion).Return(conversion); Expect.Call(provider.GetBlog(blogId)).Return(blog); Expect.Call(provider.GetAllCategories(blogId)).Return(categories); Expect.Call(provider.PageSize).Return(pageSize); Expect.Call(provider.GetBlogPosts(blogId, 0, pageSize)).Return(firstPage); Expect.Call(provider.GetBlogPosts(blogId, 1, pageSize)).Return(secondPage); mocks.ReplayAll(); //TODO: simplify when BlogML bug is fixed. StringBuilder builder = new StringBuilder(); StringWriter stringWriter = new StringWriter(builder); XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter); BlogMLWriter writer = BlogMLWriter.Create(provider); writer.Write(xmlWriter); mocks.VerifyAll(); //Verify blog. XmlDocument doc = new XmlDocument(); doc.LoadXml(builder.ToString()); XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("bml", "http://www.blogml.com/2006/09/BlogML"); XmlNode firstPostNode = doc.SelectSingleNode("bml:blog/bml:posts/bml:post[@id='" + firstPostConvertedId + "']", nsmgr); Assert.IsNotNull(firstPostNode, "Could not find post node with expected converted id" + firstPostConvertedId); XmlNode secondPostNode = doc.SelectSingleNode("bml:blog/bml:posts/bml:post[@id='" + secondPostConvertedId + "']", nsmgr); Assert.IsNotNull(secondPostNode, "Could not find post node with expected converted id" + secondPostConvertedId); XmlNode firstCategoryNode = doc.SelectSingleNode("bml:blog/bml:categories/bml:category[@id='" + firstCategoryConvertedId + "']", nsmgr); Assert.IsNotNull(firstCategoryNode, "Could not find first category node with id " + firstCategoryConvertedId); XmlNode firstPostFirstCategoryNode = doc.SelectSingleNode("bml:blog/bml:posts/bml:post[@id='" + firstPostConvertedId + "']/bml:categories/bml:category[@ref='" + firstCategoryConvertedId + "']", nsmgr); Assert.IsNotNull(firstPostFirstCategoryNode, "Could not find first post category reference to first category."); XmlNode firstPostCommentsNode = doc.SelectSingleNode("bml:blog/bml:posts/bml:post[@id='" + firstPostConvertedId + "']/bml:comments/bml:comment[@id='" + firstCommentConvertedId + "']", nsmgr); Assert.IsNotNull(firstPostCommentsNode, "Could not find first comment of the first post. Expected comment to have id: " + firstCommentConvertedId); XmlNode firstPostTrackbackNode = doc.SelectSingleNode("bml:blog/bml:posts/bml:post[@id='" + firstPostConvertedId + "']/bml:trackbacks/bml:trackback[@id='" + firstTrackbackConvertedId + "']", nsmgr); Assert.IsNotNull(firstPostTrackbackNode, "Could not find trackback with id " + firstTrackbackConvertedId); }
private PagedCollection<EntryStatsView> BuildFakeCollectionNotPublished() { var coll = new PagedCollection<EntryStatsView>(); coll.Add(new EntryStatsView() { Title = "My Post Title", EntryName = "this-is-the-title", IsActive = false, Blog = new Blog() { Title = "My Blog" } }); return coll; }
public override PagedCollection<BlogAlias> GetPagedBlogDomainAlias(BlogInfo blog, int pageIndex, int pageSize) { IDataReader reader = DbProvider.Instance().GetPagedBlogDomainAliases(blog.Id, pageIndex, pageSize); try { PagedCollection<BlogAlias> pec = new PagedCollection<BlogAlias>(); while (reader.Read()) { pec.Add(DataHelper.LoadBlogAlias(reader)); } reader.NextResult(); pec.MaxItems = DataHelper.GetMaxItems(reader); return pec; } finally { reader.Close(); } }
/// <summary> /// Gets a pageable <see cref="IList"/> of <see cref="BlogInfo"/> instances. /// </summary> /// <param name="host">The host filter. Set to null to return all blogs.</param> /// <param name="pageIndex">Page index.</param> /// <param name="pageSize">Size of the page.</param> /// <returns></returns> /// <param name="flags"></param> public override PagedCollection<BlogInfo> GetPagedBlogs(string host, int pageIndex, int pageSize, ConfigurationFlags flags) { using(IDataReader reader = DbProvider.Instance().GetPagedBlogs(host, pageIndex, pageSize, flags)) { PagedCollection<BlogInfo> pec = new PagedCollection<BlogInfo>(); while(reader.Read()) { pec.Add(DataHelper.LoadConfigData(reader)); } reader.NextResult(); pec.MaxItems = DataHelper.GetMaxItems(reader); return pec; } }
/// <summary> /// Returns a page of fully hydrated blog posts. The blog posts allow the /// user of this method to navigate blog post categories, comments, etc... /// </summary> /// <param name="blogId"></param> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> public override IPagedCollection<BlogMLPost> GetBlogPosts(string blogId, int pageIndex, int pageSize) { IPagedCollection<BlogMLPost> bmlPosts = new PagedCollection<BlogMLPost>(); using (IDataReader reader = GetPostsAndArticlesReader(blogId, pageIndex, pageSize)) { IBlogMLContext bmlContext = this.GetBlogMlContext(); while (reader.Read()) { BlogMLPost bmlPost = ObjectHydrator.LoadPostFromDataReader(reader); bmlPost.Attachments.AddRange(GetPostAttachments(bmlPost, bmlContext)); bmlPosts.Add(bmlPost); } if (reader.NextResult() && reader.Read()) bmlPosts.MaxItems = DataHelper.ReadInt32(reader, "TotalRecords"); if (bmlPosts.Count > 0 && reader.NextResult()) PopulateCategories(bmlPosts, reader); if (bmlPosts.Count > 0 && reader.NextResult()) PopulateComments(bmlPosts, reader); if (bmlPosts.Count > 0 && reader.NextResult()) PopulateTrackbacks(bmlPosts, reader); if (bmlPosts.Count > 0 && reader.NextResult()) PopulateAuthors(bmlPosts, reader); } return bmlPosts; }
public override IPagedCollection<MetaTag> GetMetaTagsForEntry(Entry entry, int pageIndex, int pageSize) { using (IDataReader reader = DbProvider.Instance().GetMetaTagsForEntry(entry, pageIndex, pageSize)) { IPagedCollection<MetaTag> tags = new PagedCollection<MetaTag>(); while (reader.Read()) { tags.Add(DataHelper.LoadMetaTag(reader)); } reader.NextResult(); tags.MaxItems = DataHelper.GetMaxItems(reader); return tags; } }
public override IPagedCollection<ViewStat> GetPagedViewStats(int pageIndex, int pageSize, DateTime beginDate, DateTime endDate) { IDataReader reader = DbProvider.Instance().GetPagedViewStats(pageIndex,pageSize,beginDate,endDate); try { IPagedCollection<ViewStat> vs = new PagedCollection<ViewStat>(); while(reader.Read()) { vs.Add(DataHelper.LoadViewStat(reader)); } reader.NextResult(); vs.MaxItems = DataHelper.GetMaxItems(reader); return vs; } finally { reader.Close(); } }
public override IPagedCollection<Link> GetPagedLinks(int categoryTypeID, int pageIndex, int pageSize, bool sortDescending) { IDataReader reader = DbProvider.Instance().GetPagedLinks(categoryTypeID, pageIndex, pageSize, sortDescending); try { IPagedCollection<Link> plc = new PagedCollection<Link>(); while(reader.Read()) { plc.Add(DataHelper.LoadLink(reader)); } reader.NextResult(); plc.MaxItems = DataHelper.GetMaxItems(reader); return plc; } finally { reader.Close(); } }
public override IPagedCollection<KeyWord> GetPagedKeyWords(int pageIndex, int pageSize) { IDataReader reader = DbProvider.Instance().GetPagedKeyWords(pageIndex, pageSize); try { IPagedCollection<KeyWord> pkwc = new PagedCollection<KeyWord>(); while(reader.Read()) { pkwc.Add(DataHelper.LoadKeyWord(reader)); } reader.NextResult(); pkwc.MaxItems = DataHelper.GetMaxItems(reader); return pkwc; } finally { reader.Close(); } }
/// <summary> /// Gets the paged feedback. /// </summary> /// <param name="pageIndex">Index of the page.</param> /// <param name="pageSize">Size of the page.</param> /// <param name="status">A flag for the status types to return.</param> /// <param name="excludeStatusMask">A flag for the statuses to exclude.</param> /// <param name="type">The type of feedback to return.</param> /// <returns></returns> public override IPagedCollection<FeedbackItem> GetPagedFeedback(int pageIndex, int pageSize, FeedbackStatusFlag status, FeedbackStatusFlag excludeStatusMask, FeedbackType type) { IDataReader reader = DbProvider.Instance().GetPagedFeedback(pageIndex, pageSize, status, excludeStatusMask, type); IPagedCollection<FeedbackItem> pec = new PagedCollection<FeedbackItem>(); while(reader.Read()) { pec.Add(DataHelper.LoadFeedbackItem(reader)); } reader.NextResult(); pec.MaxItems = DataHelper.GetMaxItems(reader); return pec; }
/// <summary> /// Returns a pageable collection of entries ordered by the id descending. /// This is used in the admin section. /// </summary> /// <param name="postType">Type of the post.</param> /// <param name="categoryID">The category ID.</param> /// <param name="pageIndex">Index of the page.</param> /// <param name="pageSize">Size of the page.</param> /// <returns></returns> public override IPagedCollection<Entry> GetPagedEntries(PostType postType, int categoryID, int pageIndex, int pageSize) { IDataReader reader = DbProvider.Instance().GetPagedEntries(postType, categoryID, pageIndex, pageSize); try { PagedCollection<Entry> pec = new PagedCollection<Entry>(); while(reader.Read()) { pec.Add(DataHelper.LoadEntryStatsView(reader)); } reader.NextResult(); pec.MaxItems = DataHelper.GetMaxItems(reader); return pec; } finally { reader.Close(); } }