【问题标题】:NHibernate - dynamic QueryOver parameterNHibernate - 动态 QueryOver 参数
【发布时间】:2012-10-08 22:36:11
【问题描述】:

我有一个 MVC 项目,我正在尝试为其设置一个不错的分页解决方案。

我在 SQL Server 中有几个表,它们有几千行,我希望能够翻页。如果我没有任何类型的过滤器可应用于分页,它会很好用。这是我用来执行此操作的方法:

    public virtual PagedList<T> GetPagedData(int startIndex, int count) {
        var rowCount = session.CreateCriteria(typeof(T)).SetProjection(Projections.RowCount()).FutureValue<Int32>().Value;
        var pageOfItems = session.CreateCriteria(typeof(T)).SetFirstResult(startIndex).SetMaxResults(count).List<T>();
        return new PagedList<T>(pageOfItems, startIndex, count, rowCount);
    }

我还希望能够传入查询以进一步缩小结果范围,并返回一个新的分页表。到目前为止我所拥有的是:

    public virtual PagedList<T> GetPagedData<T>(int startIndex, int count, System.Linq.Expressions.Expression<Func<T, bool>> predicate) where T : class {
        var rowCount = session.QueryOver<T>().Where(predicate).Select(Projections.RowCount()).FutureValue<Int32>().Value;

        var pageOfItems = session.QueryOver<T>().Where(predicate).Skip(startIndex).Take(count).List<T>();
        return new PagedList<T>(pageOfItems, startIndex, count, rowCount);
    }

对 this 的调用如下所示:

networks = mRepository.GetPagedData<Network>(page ?? 1, pageSize, x => x.Name.Contains(q));

问题是,它不喜欢“包含”表达式。如果我进行完全匹配,它可以正常工作(x.Name == q),但我没有得到我想要的结果。

我看到的使用“包含”的异常是:

无法识别的方法调用:System.String:Boolean Contains(System.String)

有没有人知道如何让它动态地接受这样的表达式?我有一个基础存储库类,我已将它放入其中,因为我将对其他几个表使用相同类型的行为。我可以为每个表编写一个单独的方法,但如果可能的话,我宁愿动态地这样做。

感谢您的建议!

【问题讨论】:

    标签: c# asp.net-mvc nhibernate


    【解决方案1】:

    QueryOver 不是 LINQ,它只接受非常有限的一组表达式。

    我的建议是您重写您的方法以使用 LINQ,将 QueryOver 替换为 Query。唯一的问题是使用将来的查询来进行计数比较困难(有关详细信息,请参阅this answer

    这是一个没有 Future 的版本:

    public virtual PagedList<T> GetPagedData<T>(int startIndex, int count,
                   Expression<Func<T, bool>> predicate) where T : class
    {
        var query = session.Query<T>().Where(predicate);
        var rowCount = query.Count();
        var page = query.Skip(startIndex).Take(count).List<T>();
        return new PagedList<T>(pageOfItems, startIndex, count, rowCount);
    }
    

    【讨论】:

    • 感谢您的建议。这很完美。我将研究那篇文章以了解未来查询的用法,但我很高兴在此期间让它工作。
    【解决方案2】:

    对于QueryOver,你必须使用扩展方法IsLike,所以x.Name.IsLike(q, MatchMode.Anywhere)

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 2023-03-20
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多