【问题标题】:Pageddatasource fails paging With "does not implement ICollection."Pageddatasource 分页失败,出现“不实现 ICollection”。
【发布时间】:2023-03-31 03:15:01
【问题描述】:

我有一个中继器,我需要分页,所以我正在使用 PagedDatasource。

给定:

string tag = Request.QueryString["category"];

并且标记变量不为空,然后 PagedDataSource 分页失败并出现以下错误:

异常详细信息:System.Web.HttpException:无法计算计数 未实现 ICollection 的数据源。

在这一行:

lblCurrentPage.Text = "Page: " + (CurrentPage + 1).ToString() + " of " + pagedDS.PageCount.ToString();

注意:当标签变量为空时,分页工作正常。

完整代码如下:

string tag = Request.QueryString["category"];
var ba = new DataBase.BlogAdapter();

PagedDataSource pagedDS = new PagedDataSource();
pagedDS.AllowPaging = true;
pagedDS.PageSize = 3;

if (String.IsNullOrEmpty(tag))
{
    pagedDS.DataSource = ba.GetArticles(null, null);
}
else
{
    var t = new DataBase.Tag() { TagName = tag };
    var tec = new DataBase.TagEqualityComparer();
    pagedDS.DataSource = ba.GetArticles(null, null).Where(a => a.Tags.Contains(t, tec));
    CurrentPage = 0;
}

pagedDS.CurrentPageIndex = CurrentPage;

// NEXT LINE FAILS IF "tag" IS NOT EMPTY
lblCurrentPage.Text = "Page: " + (CurrentPage + 1).ToString() + " of " + pagedDS.PageCount.ToString(); 

【问题讨论】:

    标签: c# asp.net repeater datasource paging


    【解决方案1】:

    您可能需要将过滤器具体化为一个集合,例如

    ba.GetArticles(null, null).Where(a => a.Tags.Contains(t, tec)).ToList();
    

    IQueryable<> 只实现了IEnumerable,而IList<> 实现了ICollection

    【讨论】:

    • 谢谢。现在可以了。还是不知道为什么不过滤就可以,过滤就失败了
    • @levanlevi - 如果没有过滤,你的 ba.GetArticles() 的返回可能是一个具体的集合。但是,一旦您应用 Where,返回类型就是一个尚未“执行”的 IQueryable(即没有像 Count 这样的 ICollection 属性)。 PagedDataSource 必须遍历 IEnumerable 才能对其进行计数,它不想执行 FWR。
    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多