此行返回什么样的对象?如何查看它的元数据以查看具有哪些继承和方法?
IQueryable<Product> products = repository.Products
.OrderBy(p => p.ProductID)
.Skip((page - 1) * PageSize)
.Take(PageSize);
在调试模式下,我看到它返回以下对象:
System.Collections.Generic.List`1[SportsStore.Domain.Entities.Product].OrderBy(p => p.ProductID).Skip(3).Take(3)
答案 0 :(得分:4)
在您假设的意义上,它并没有真正返回单个对象。它返回的是一个&#34; Query&#34;,(一个实现IQueryable<Product>
的对象),它具有迭代的能力,并返回一组对象(类型为Product
)时调用代码在其上调用foreach
。在调用代码调用foreach
之前,它实际上并未处理查询。
您可以将它(返回对象)视为指令集,以了解如何处理,切片,切块和过滤您开始使用的对象集(repository.Products
)并生成来自该初始集的新对象集。
在代码上调用foreach
之前,代码实际上并未生成此新集。如果你想要实际构建这个新集合(所以你可以自己操作它或者自己迭代它),那么你可以按照@MotoSV的描述在它上面调用ToList()
。
List<Product> products = repository.Products
.OrderBy(p => p.ProductID)
.Skip((page - 1) * PageSize)
.Take(PageSize).ToList();
答案 1 :(得分:3)
它将IQueryable
类型Products
返回给Product
个实例的集合。如果要查看products
的内容,则在LINQ语句上放置一个断点,跳过该行,然后将鼠标悬停在products
变量上以查看其内容。
注意,您可能必须在LINQ语句的末尾执行ToList()
以查看结果,因为它们可能尚未从您的存储库返回。检查Take
方法是否“急切”加载结果。如果您的存储库是对象的集合,那么将不需要ToList
,但是如果您正在访问数据库,即通过实体框架,那么它将是。