C# 难以理解的混乱

C# 难以理解的混乱,c#,linq,C#,Linq,我有一个关于IQueriable的问题。也许我的理解是错误的,但我认为调用ToList()会强制执行查询。我有一个PaginatedList类,我想使用IQuerriable填充它,但当我这样做时,我会得到一系列空对象。谁能告诉我我做错了什么 public class PaginatedList<T> : List<T> { public PaginatedList(IQueryable<T> source, int pageIndex, in

我有一个关于IQueriable的问题。也许我的理解是错误的,但我认为调用ToList()会强制执行查询。我有一个PaginatedList类,我想使用IQuerriable填充它,但当我这样做时,我会得到一系列空对象。谁能告诉我我做错了什么

public class PaginatedList<T> : List<T>  
{  
    public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)  
    {  
        PageIndex = pageIndex;  
        PageSize = pageSize;  
        TotalCount = source.Count();  
        TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);  
        List<T> temp = source.Skip(PageIndex * PageSize).Take(PageSize).ToList();  
        this.AddRange(temp);  
    }    
}  
公共类分页列表:列表
{  
公共分页列表(IQueryable源、int pageIndex、int pageSize)
{  
PageIndex=PageIndex;
PageSize=页面大小;
TotalCount=source.Count();
TotalPages=(int)数学上限(TotalCount/(double)PageSize);
List temp=source.Skip(PageIndex*PageSize).Take(PageSize).ToList();
这个.AddRange(temp);
}    
}  
我的临时列表正在填充默认值。我不明白。任何帮助都将不胜感激

该列表填充如下:

 public IQueryable<Transaction> GetTransactions()  
    {  
        return from trx in pingDataContext.Table0
        join pdo in pingDataContext.Table1
        on trx.AssociatedID equals pdo.ID  
        where trx.Type == 1 &&  
        pdo.PortalID == 330  
        select new Transaction(trx.ID, pdo.CreateDate, pdo.Msisdn, pdo.Remarks, 0.1, 
                               (double)pdo.Price, pdo.DnldLink, pdo.UserIP);  
    }
publicIQueryable GetTransactions()
{  
从pingDataContext.Table0中的trx返回
在pingDataContext.Table1中加入pdo
在trx上,AssociatedID等于pdo.ID
其中trx.Type==1&&
pdo.PortalID==330
选择新事务(trx.ID、pdo.CreateDate、pdo.Msisdn、pdo.备注、0.1、,
(双)pdo.Price、pdo.DnldLink、pdo.UserIP);
}
我正在此处创建分页列表:

var transactions = transactionRepository.GetTransactions();  
var paginatedTransactions = new PaginatedList<Transaction>(transactions,
                                                           (int)page,
                                                           pageSize);  
var transactions=transactionRepository.GetTransactions();
var paginatedTransactions=新的PaginatedList(事务,
(int)第页,
页面大小);

谢谢

您说您的列表中充满了默认值。如果您的意思是
默认值(T)
,那么这就是问题所在:
default(T)
返回
null
T
是一个引用类型。
您使用的
ToList()
与此无关。在您的代码中甚至不需要它。以下内容相当:

var temp = source.Skip(PageIndex * PageSize).Take(PageSize);
this.AddRange(temp);  

原因是
AddRange
无论如何都会枚举传递的可枚举项。

嗨,Daniel,这是否意味着我只能为基元类型提供此类列表?或者我该如何解决这个问题?@Steve:不,这个结论不正确。您应该简单地用真实对象填充列表,而不是
null
。请使用创建列表的代码更新您的问题。然后,我也许能帮上更多的忙。现在我真的不明白你的问题了。问题在于
temp
包含0个项目,或者它包含多个项目,但都
null
?分页列表中的每个项目似乎都是默认的。对于所讨论的对象,事务,每个字符串为null,每个int为1,日期时间为0001/01/01 00:00:00。尽管如此,我还是得到了一个完整的对象列表。我在这里真的迷失了自己:-事实上,即使我硬编码为0.1的值,一个双精度值,也不知怎么地变成了0。这是一个相同默认对象的分页列表。我很困惑。。无论如何,谢谢你的帮助。为什么要使用IQueryable作为参数。使用IEnumerable就可以了。我希望查询只在这个阶段形成,以承担数据库的负载。此外,您将枚举列表三次。一个用于.CounT()、一个用于ToList()和一个用于AddRange。因为您没有使用totaqlpage(至少在上面的代码中没有),所以可以去掉其中两个(Count和to list),但这与输入参数无关。这并不意味着已经做了什么。IQueryable也是IEnumerbale(),因此您为源传递的任何内容都将是passble作为IEnumerable传递它将导致分页发生在客户端而不是服务器端。它应该作为iQueryEnable传入,以保留和修改表达式树并添加跳过/获取部分。