【问题标题】:Help with IQueryables and lazyLoading in asp.net mvc在 asp.net mvc 中帮助 IQueryables 和延迟加载
【发布时间】:2011-02-07 17:37:05
【问题描述】:

假设我想添加分页支持。 我的应用在 Web、服务和存储库中是分开的。

Controller 只与 Service 对话,Service 获取数据并执行业务逻辑。

说我想要分页支持.. 我的 ContributorService 中有这个方法

public IQueryable<Contributor> GetContributors(int page, int pageSize)
        {
            return _repository.GetAll().OrderBy(c=>c.ACC_CREATEDATE).Skip((page)*pageSize).Take(pageSize);//solo temporalmente
        }

这样好吗??还是应该在存储库中完成 OrderBy、Skip、Take?

目前只做这个

public IQueryable<Contributor> GetAll()
        {
            return db.Contributors;
        }

【问题讨论】:

  • 无论哪种方式都没有区别,因为只有在 IQueryable 上调用“.ToList()”或访问集合中的第一个元素时才会执行查询。可以通过 LinqToSqlProfiler 确认。

标签: asp.net-mvc entity-framework-4 lazy-loading repository-pattern


【解决方案1】:

我会将查询添加到业务对象(我认为您没有,是吗),您可能有它的基本版本,而另一个用于分页数据。并且希望通过调用 ToList 来执行该查询,我发现将查询对象返回给控制器很危险。

您的存储库可能有一个 GetPartial 方法,其中包含排序、从、到和过滤器参数。如果您有一个通用服务,您也可以在该通用服务中实现它。

public List<Contributor> GetPartial<TSortBy>(Expression<Func<Contributor, TSortBy>> sortByExpr, Expression<Func<Contributor, bool>> filterExpr, int pageNo, int pageSize)
        {
            var query = db.Contributors;
            if (filterExpr != null)
                   query.Where(filterExpr);
query.orderBy(sortByExpr).Skip (...).Take(...).ToList();

        }

如果你有一个 Repository 类,你可以添加这个方法。 顺便说一句,我使用的是动态 LINQ,它可以更轻松地将按表达式的顺序作为纯文本传递(就像 sql 一样)

【讨论】:

    猜你喜欢
    • 2011-02-27
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多