[英]How to return IQueryable<T> for further querying
我正在尝试从这里的PagedList.Mvc库
https://github.com/TroyGoode/PagedList
哪个有这个用法样本
var products = MyProductDataSource.FindAllProducts(); //returns IQueryable<Product> representing an unknown number of products. a thousand maybe?
var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
var onePageOfProducts = products.ToPagedList(pageNumber, 25); // will only contain 25 products max because of the pageSize
MyProductDataSource.FindAllProducts()的典型意义; 是沿着的
public IQuerable<T> MyProductDataSource.FindAllProducts()
{
using ( var ctx = new MyCtx() )
{
return ctx.MyList().Where( .... );
}
}
当然有InvalidOperationException()和DBContext已经处理过消息
寻找有关如何返回IQueryable的最佳实践,可以在这里使用而没有问题?
好的做法是通过使用IoC容器按照HTTP请求保持DbContext的生命周期,大多数IoC容器支持HttpRequest生命周期。
因此,您可以利用DbContext的范围,它允许您在上层使用IQueryable
。
更多信息我喜欢哪两个IoC容器: autofac和ninject 。
如果您是IoC容器的新手,建议您查看Martin Flower的依赖注入的基本概念。 然后继续使用您选择的IoC容器之一。
但是,你需要非常小心如何使用IQueryable
以及你应该停止支持它的哪个层。 如果没有,后面的恶魔,实体框架的延迟加载将降低性能。 我的一个规则是不支持View上的IQueryable
。
您需要“向上移动”数据上下文的范围:
public IQueryable<T> MyProductDataSource.FindAllProducts(MyCtx context)
{
return context.MyList().Where( .... );
}
然后在更大的范围创建上下文:
using (var ctx = new MyCtx())
{
var products = MyProductDataSource.FindAllProducts(ctx);
var pageNumber = page ?? 1;
var onePageOfProducts = products.ToPagedList(pageNumber, 25);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.