1

どういうわけかQueryOverAPIを拡張することは可能ですか?追加したいのは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クエリを追加して返します。NHibernateでも同様のことが行われていQueryOverRestrictionBuilderます...しかし、上記は機能していて十分に単純ではありませんか?

于 2012-12-13T08:30:20.633 に答える