私は単純なデータベース アプリケーションを使用しており、データベースとのやり取りに WCF と Entity Framework を使用しています。
私のサービスには、DatabaseTable という親クラスがあり、他のすべてのクラスはこのクラスから継承し、以下にリストされているメソッドをオーバーライドします (これらはサービス コントラクトにもあり、クライアント側アプリに公開されます)。
選択 更新 挿入 削除 GetAll GetSetByKey
これらの各サービスは、DatabaseTable オブジェクトをパラメーターとして受け取り、必要なことを行います。
問題は、私のクラスの 1 つである Part に、GetSetByKey (DataBaseObject パラメータで送信された基準に基づいてリストを埋める) への複数の方法があることです。他のクラスはすべて主キーから取得しますが、このクラスでは、Vendor、PurchaseOrderNumber、Claim、InvoiceNumber、ShipToUser などのさまざまな基準で GetSets (またはリスト) する必要があります...
私がやり始めたのは、以下のような if ステートメントを使用することでした
if (this.Claim == 0) // Get By PO
{
if (string.IsNullOrEmpty(this.InvoiceNumber) && this.VendorCode == 0)
{
parts = (from part in context.Parts where part.PurchaseOrder == this.PurchaseOrder select part).ToList<Parts>();
}
else if (this.VendorCode == 0)
{
parts = (from part in context.Parts where part.InvoiceNumber == this.InvoiceNumber select part).ToList<Parts>();
}
else
{
parts = (from part in context.Parts where part.VendorCode == this.VendorCode select part).ToList<Parts>();
}
}
else
{
parts = (from part in context.Parts where part.Claim == this.Claim select part).ToList<Parts>();
}
これは、他の条件が 1 つしかないときはうまくいきましたが、ご覧のとおり、手に負えなくなってきています。Reflection を使用してフィールドの名前を渡し、それを使用してクエリを実行できることは承知していますが、Reflection は非常に高価なプロセッサであると言われています。
サービスをきれいに保とうとしているので、GetPartsByVedndor()
またはのような特定のコントラクトを追加するのではなく、基本的な SQL コマンドしかありませんGetPartsByPurchaseOrder()
。サービスの実装を非常にクリーンに保つ以外に、論理的な理由はありません。
リフレクションまたはサービスへの新しいメソッドの追加を除いて途方に暮れているため、これをより適切に行う方法について他に提案はありますか。ここで Reflection を使用しても問題ないと思われる場合は、問題がある場合について説明してください。