IQueryable <t>种类的对象</t>

时间:2014-05-11 15:48:55

标签: c# linq

此行返回什么样的对象?如何查看它的元数据以查看具有哪些继承和方法?

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)

2 个答案:

答案 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,但是如果您正在访问数据库,即通过实体框架,那么它将是。