1

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

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

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

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

但是想要有强类型的方式来做到这一点。有没有扩展 QueryOver 的例子?

4

1 回答 1

2

有一种非常简单的方法,如何获取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并返回查询。类似的是QueryOverRestrictionBuilder在 NHibernate 中做...但上述工作不够简单吗?

于 2012-12-13T08:30:20.633 回答