私が抱えている問題は、Fluent NHibernateのようなものに移行するという考えで、既存のORM(これはGentleという古いものです)を使用してデータアクセスレイヤを構築することです。パラメータがあるということでこれはジェネリックスとC#の動的データ型の適切な使用ですか?
"PersonId in (SELECT PersonId from Orders where OrderValue > " + orderValue + " and OrderName = " + orderName
ポイント:我々はいくつかの人のオブジェクトを取得する際、インスタンスのために、我々はLIKE句を追加するかもしれませんので、当社の既存のセットアップでSqlBuilderにカスタム句を追加する必要があり、いくつかのクエリがあります。パラメータ化されたクエリではなく文字列に直接追加されるため、Gentleではパラメータ化されたクエリとして追加することが可能です。これが私が取り組んできたものです。すべてのDALはベースGentleDAL
から継承しています。これは実際に穏やかなクエリを作成し、句とパラメータなどを追加するクラスです。Gentleでparameterised句を追加するには、SqlBuilderオブジェクトで2つのことを行う必要があります。sb.AddConstraint(string clause)
あなたの句を追加してから、sb.AddParameter(string name, Type type)
を呼び出す必要がある各パラメータについて、SqlStatement
オブジェクトをこれから構築し、それ以降はstmt.SetParameter(string name, object value)
を呼び出すパラメータの値を設定することができます。
これらのパラメータ/句を表現する方法は、GentleClauseCollectionというクラスを作成したことです。これには句とパラメータが含まれており、これらの両方のメソッドのAddメソッドとGetメソッドがあります。節は文字列でListの内部に格納され、パラメータはジェネリックを使用するGentleParameterクラスに格納されます。 GentleParameterの完全なコードは次のとおりです。
public class GentleParameter<TParamType>
{
public string Name { get; private set; }
public TParamType Value { get; private set; }
public Type ParameterType {get { return typeof (TParamType); }}
public GentleParameter(string parameterName, TParamType parameterValue)
{
Name = parameterName;
Value = parameterValue;
}
}
私は私が同じコレクション内TParamTypeの異なる値に対してGentleParameterを保存しましょうということを知ってる.NETには、コレクションは、しかし、それはDLRを使用して行うことができ、ありません。私のGentleCollectionクラスでは、Listにパラメータを格納し、このクラスのパラメータをIEnumerableとして取得します。私のクラスのAddメソッドは、GentleParameterの追加だけを許可することができるので、私のパラメータには常にアクセスできるName、Value、ParameterTypeフィールドがあることがわかっています。
私はジェネリックスを犠牲にして、パラメータクラスのValueプロパティをTではなく 'オブジェクト'に変更することができたので、ダイナミックを使って過度に複雑にしましたか、両方のアプローチの長所と短所は何ですか?動的オブジェクトを使用するすべてのメソッド呼び出しが実行時にコンパイルされるため、私は思っていないし、パフォーマンスに与える影響が、動的を使用することによってどのくらい重大な影響を及ぼすのかという3つ目の方法がありますか?
ご協力いただきありがとうございます。
ありがとう、私はコンセンサスであると思った。 –