2012-12-12 168 views
1

是否可以通過某種方式擴展QueryOver API?我想添加的是folNHibernate QueryOver擴展性

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

其中扇區是位標誌枚舉。我們有這樣的準則的ICriteria API,我可以做

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

但希望有這樣做的強類型的方式。有什麼擴展QueryOver的例子嗎?

回答

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並返回查詢。類似的是在NHibernate中做QueryOverRestrictionBuilder ...但是不是上面的工作和足夠簡單嗎?

+0

請參閱https://github.com/AndreasJilvero/NHibernate.Bitwise瞭解使用QueryOver(包括「has any」)的優秀解決方案。 – Ted