我有这个方法,它选择特定范围内的数据(pageIndex和pageSize)
public PagedList(IQueryable<T> source, int pageIndex, int pageSize)
{
this.AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList());
}
我想创建一个选择所有数据的重载方法,所以,这是我的代码
public PagedList(IQueryable<T> source)
{
//this.AddRange(source.Select(x => new T()).ToList()); (1)
this.AddRange(source.AsQueryable().ToList()); (2)
}
首先,我试过(1),但它不接受T.然后我尝试了(2),并且建议我应该使参数类型为INumerable而不是IQueryable。在这种情况下,选择所有数据的解决方案是什么?
由于
答案 0 :(得分:4)
你可以这样做:
public PagedList(IEnumerable<T> source)
{
this.AddRange(source);
}
IEnumerable<T>
作为参数类型而非IQueryable<T>
,因为您不使用特定于IQueryable<T>
的任何功能。AsQueryable
,因为您只想要所有数据ToList
,List<T>.AddRange
内部已经执行了副本。使用ToList
时,将会进行两次复制操作。答案 1 :(得分:0)
出了什么问题:
public PagedList(IQueryable<T> source)
{
this.AddRange(source.ToList());
}
制作一些可查询的东西然后使它成为一个列表似乎很奇怪。特别是考虑到源已经是可查询的。
答案 2 :(得分:0)
IEnumerable和IQueryable都很好,它只取决于你真正需要的东西。为了更好的案例研究,你可以阅读它。
What is the difference between IQueryable<T> and IEnumerable<T>?