2016-05-02 7 views
1

誰でも、whichever field [equals | lt | gt | notEquals ...] some_valueを求めるためにHibernate Linq Providerを拡張するためのいくつかの例を提供するかもしれません。すなわち、NHibernate Linqプロバイダを拡張する

WhichEverField()は、拡張方法である。

アイデア?

答えて

1

これは、クエリでConvert.ToInt64()を使用することができます、私は一度書いたクラスである:

public class ConvertToInt64HqlGenerator : BaseHqlGeneratorForMethod 
{ 
    public ConvertToInt64HqlGenerator() 
     : base() 
    { 
     this.SupportedMethods = new[] { ReflectionHelper.GetMethodDefinition(() => Convert.ToInt64("")), 
             ReflectionHelper.GetMethodDefinition(() => Convert.ToInt64(0)), 
             ReflectionHelper.GetMethodDefinition(() => Convert.ToInt64(0M))}; 
    } 

    public override HqlTreeNode BuildHql(MethodInfo method, 
              Expression targetObject, 
              ReadOnlyCollection<Expression> arguments, 
              HqlTreeBuilder treeBuilder, 
              IHqlExpressionVisitor visitor) 
    { 
     return treeBuilder.Cast(visitor.Visit(arguments[0]).AsExpression(),typeof(Int64)); 
    } 
} 

それを使用するには、レジストリのクラスを作成する必要があります。

public class MyLinqToHqlGeneratorsRegistry : DefaultLinqToHqlGeneratorsRegistry 
{ 
    public MyLinqToHqlGeneratorsRegistry() 
     : base() 
    { 
     this.Merge(new ConvertToInt64HqlGenerator()); 
    } 
} 

そして、あなたの設定に追加します。

Fluently.Configure().Database(msSQLconfig) 
        .ExposeConfiguration(c => c.LinqToHqlGeneratorsRegistry<MyLinqToHqlGeneratorsRegistry>()) 
1

番目のいずれかの場合は、このlistの間でチェックアウト可能エクステンションの可能性により、あなたの目標を達成することができます。

私はあなたの質問を正しく理解していれば、これは実行可能であるとは思えません。私は、どのような列の意味論を扱っているのかわからないので、そのような意味論を持っているLINQの拡張をSQLクエリに変換することができるのはどうしてわかりません(さらにHQLという拡張子が必要ですは、LINQクエリをHQLに変換することによって機能します)。

LINQの拡張子で直接その意味を処理する場合は、内部に多くのor比較基準を生成することで、提案されたc.WhichEverField().Equals(1)のいずれかに表示されません。
AlexDev answerのようなものを使用するだけでなく、しかし、あなたは引数に関して型検査をしなければならず、BuildHqlメソッドの中には些細でないHqlTreeビルディングを構築する必要があります。
BuildHqlメソッドが定義された通りにWhichEverField拡張のために呼び出される時点で、あなたのオペランドでどの比較が行われなければならないか分からないので、失敗します。

拡張子がc.WhichEverField(SomeComparisonTypeEnum.Equal, 1)の場合もありますが、それでも対応できますが、とにかく簡単なことはありません。
これが役に立つかもしれない場合は、(私の)hereの他のリンクをたどってみてください。しかしそれらのどれもあなたの要求の複雑さのレベルはありません。

関連する問題