繁体   English   中英

如何返回IQueryable <T> 进一步查询

[英]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容器: autofacninject

autofac如何在这里支持MVC

或者NInject如何在这里支持MVC

如果您是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM