0

私は単純なデータベース アプリケーションを使用しており、データベースとのやり取りに 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 を使用しても問題ないと思われる場合は、問題がある場合について説明してください。

4

0 に答える 0