【问题标题】:Unable to add to IPagedList object or transfer List<T> to IPagedList<T>无法添加到 IPagedList 对象或将 List<T> 传输到 IPagedList<T>
【发布时间】:2013-10-08 17:09:28
【问题描述】:

我正在使用Page List ASP MVC 插件向我的视图添加分页,因为我的视图模型包含一个有时会有点失控的列表。但是,我遇到了一些问题。

  • 视图模型包含另一个模型对象的List&lt;T&gt;。如果我对数据库进行一次查询,我可以将此列表的数据类型从 List&lt;ZipCodeTerritory&gt; 更改为 IPagedList&lt;ZipCodeTerritory&gt;,然后只需按照文档从查询中加载列表,如下所示:

查看模型

public IPagedList<ZipCodeTerritory> zipCodeTerritory { get; set; }

控制器

search.zipCodeTerritory = (from z in db.ZipCodeTerritory
                          where z.StateCode.Equals(search.searchState) &&
                                z.EffectiveDate >= effectiveDate
                         select z).ToList().ToPagedList(pageNumber, pageSize);

//This works but this only covers one of the three different searches that are 
//possibly from this Index page
  • 但是,这会带来一些问题。一方面,我无法使用 C# List 使用的 .clear 方法。其次,更重要的是,如果我需要执行不同的搜索,在其中多次访问数据库并将每个查询的结果添加到 zipCodeTerritory 列表中,我无法调用 .addRange() 方法。有谁知道如何向IPagedList 添加项目?

查看模型

public IPagedList<ZipCodeTerritory> zipCodeTerritory { get; set; }

控制器

foreach (var zip in zipArray)
{
    var item = from   z in db.ZipCodeTerritory
                where  z.ZipCode.Equals(zip) &&
                        z.EffectiveDate >= effectiveDate &&
                        z.IndDistrnId.Equals(search.searchTerritory) &&
                        z.StateCode.Equals(search.searchState)
                select z;
    search.zipCodeTerritory.AddRange(item); //This line throws the following exception:

    //PagedList.IPagedList<Monet.Models.ZipCodeTerritory>' does not contain a 
    //definition for 'AddRange' and no extension method 'AddRange' accepting a first 
    //argument of type 'PagedList.IPagedList<Monet.Models.ZipCodeTerritory>' could be 
    //found (are you missing a using directive or an assembly reference?)
} 
  • 我还尝试简单地保留添加分页之前的代码,然后尝试将List&lt;T&gt; 转换为IPagedList&lt;T&gt; 对象,但这也不起作用。这种方法将解决我上述所有问题,所以如果有人知道如何简单地将List 转换为IPagedList,将不胜感激。

查看模型

    public IPagedList<ZipCodeTerritory> pagedTerritoryList { get; set; }
    public List<ZipCodeTerritory> zipCodeTerritory { get; set; }

控制器

search.pagedTerritoryList = (IPagedList<ZipCodeTerritory>)search.zipCodeTerritory;

//This threw the following exception at runtime: 
//Unable to cast object of type  
//System.Collections.Generic.List'1[Monet.Models.ZipCodeTerritory]' to type 
//'PagedList.IPagedList'1[Monet.Models.ZipCodeTerritory]'.

【问题讨论】:

  • 你有什么问题?
  • 查询数据时,是否要从第0页重新开始?如果是这样,为什么不使用第一步中概述的方法将其放入List&lt;T&gt;(如果需要,包括附加),然后在最后调用.ToPagedList()
  • @msmucker0527:想知道是否有人知道如何将项目添加到IPagedList 或将通用List 转换为IPagedList
  • @GalacticCowboy:问题在于我在另一个搜索中,我需要将项目添加到IPagedList,而IPagedList 没有.addRange() 方法或任何其他方法我发现的方式是逐步向其中添加项目。
  • @NealR - 对,在完成之前不要将其转换为 IPagedList。为您的 List 创建一个本地临时变量,将其 AddRange() 添加到您想要的内容,然后在您准备好时创建 ToPagedList()。

标签: c# .net asp.net-mvc asp.net-mvc-3 pagedlist


【解决方案1】:

要将您的各种方法组合在一起,您可能应该这样做(基于您的第一个示例):

var mySearch = (from z in db.ZipCodeTerritory
                      where z.StateCode.Equals(search.searchState) &&
                            z.EffectiveDate >= effectiveDate
                     select z);

// Other searches, whatever; use mySearch.AddRange() here

search.zipCodeTerritory = mySearch.ToPagedList(pageNumber, pageSize);

【讨论】:

  • 由于您在枚举mySearch,因此实际上是在剥离 PagedList 提供的分页功能。
  • 通过调用ToList() 你使ToPagedList() 毫无意义,因为数据库已经返回了所有记录,然后将它们分页到内存中,正如@odys 上面提到的那样。因此,如果查询返回 100 万条记录,则返回所有 100 万条记录,然后在内存中分页,而不是由数据库分页,因此如果页面大小为 10,则只返回 10 条而不是 100 万条。
  • @Lankymart 我会修复它。 ToList() 来自 OP。
  • @Lankymart 嗯...我会留下我的编辑,但看看 OP 实际上试图做的事情比这更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 2012-02-13
  • 1970-01-01
  • 2017-02-27
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多