誰でも、whichever field [equals | lt | gt | notEquals ...] some_value
を求めるためにHibernate Linq Providerを拡張するためのいくつかの例を提供するかもしれません。すなわち、NHibernate Linqプロバイダを拡張する
WhichEverField()
は、拡張方法である。
アイデア?
誰でも、whichever field [equals | lt | gt | notEquals ...] some_value
を求めるためにHibernate Linq Providerを拡張するためのいくつかの例を提供するかもしれません。すなわち、NHibernate Linqプロバイダを拡張する
WhichEverField()
は、拡張方法である。
アイデア?
これは、クエリで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>())
番目のいずれかの場合は、このlistの間でチェックアウト可能エクステンションの可能性により、あなたの目標を達成することができます。
私はあなたの質問を正しく理解していれば、これは実行可能であるとは思えません。私は、どのような列の意味論を扱っているのかわからないので、そのような意味論を持っているLINQ
の拡張をSQLクエリに変換することができるのはどうしてわかりません(さらにHQL
という拡張子が必要ですlinq-to-nhibernateは、LINQ
クエリをHQL
に変換することによって機能します)。
LINQ
の拡張子で直接その意味を処理する場合は、内部に多くのor
比較基準を生成することで、提案されたc.WhichEverField().Equals(1)
のいずれかに表示されません。
AlexDev answerのようなものを使用するだけでなく、しかし、あなたは引数に関して型検査をしなければならず、BuildHql
メソッドの中には些細でないHqlTree
ビルディングを構築する必要があります。
BuildHql
メソッドが定義された通りにWhichEverField
拡張のために呼び出される時点で、あなたのオペランドでどの比較が行われなければならないか分からないので、失敗します。
拡張子がc.WhichEverField(SomeComparisonTypeEnum.Equal, 1)
の場合もありますが、それでも対応できますが、とにかく簡単なことはありません。
これが役に立つかもしれない場合は、(私の)hereの他のリンクをたどってみてください。しかしそれらのどれもあなたの要求の複雑さのレベルはありません。