【问题标题】:NHibernate QueryOver extensibilityNHibernate QueryOver 可扩展性
【发布时间】:2012-12-12 13:02:15
【问题描述】:

是否可以通过某种方式扩展 QueryOver API?我要补充的是fol

var criteria = QueryOver.Of<InternalAssessor>()
    .WhereRestrictionOn(x => x.Sector).HasAtLeastOneFlagSet((int)sector)

其中扇区是位标志枚举。我们对 ICriteria API 有这样的标准,我可以做到

.Where(BitwiseRestrictions.AtLeastOneFlagSet("Sector", (int)sector))

但是希望有强类型的方式来做这件事。有没有扩展 QueryOver 的例子?

【问题讨论】:

    标签: .net nhibernate lambda queryover


    【解决方案1】:

    有一种非常简单的方法,如何获取IQueryOver,搜索其基础条件并附加一个,参见https://gist.github.com/2304623

    public static IQueryOver<TRoot, TSubType> WhereBitwiseRestriction<TRoot, TSubType>(
      this IQueryOver<TRoot, TSubType> query
      , Expression<Func<TSubType, object>> expression
      , int number)
    {
      var name = ExpressionProcessor.FindMemberExpression(expression.Body);
      query.UnderlyingCriteria.Add
      (
        BitwiseRestrictions.AtLeastOneFlagSet(name, number)
      );
      return query; 
    }
    

    并使用它

    var criteria = QueryOver.Of<InternalAssessor>()
        ...
        .WhereRestrictionOn(x => x.Name).IsLike(searchedName) // standard
        ...
        .WhereBitwiseRestriction(x => x.Sector, (int)sector) // custom
        ...
    

    为了完全满足您的要求,我们需要引入一些中间人对象,它将引用query 和我们的BitwiseRestrictions。另一个扩展程序将立即接受它,附加number 并返回查询。类似的是在 NHibernate 中做QueryOverRestrictionBuilder...但是上面的工作不够简单吗?

    【讨论】:

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