タイトルが示すように、私は金融アプリケーションにエンティティフレームワーク4.0を使用しています。私が持っているすべてのチェック(チェック)をリストするwinformがあります。しかし、その形式では、ユーザーはいくつかのフィルターを指定できます。
ユーザーがフィルターを適用しない場合は、次のようにクエリを実行できます。
lista_cheques = db.Cheque.Include("Operacion").Include("Cliente").ToList();
datagridview.Datasource = lista_cheques;
それは簡単です。しかし、フィルターを適用すると、問題はさらに大きくなります。
ご覧のとおり、ユーザーはフィルターを使用して、特定のクライアントの小切手(小切手)、日付、銀行、CUIT番号、小切手状態などを確認できます。
さて、私の質問はクエリのパフォーマンスに関連しています。
私は次のように、フィルターを分離して実行することを考えていました。
lista_cheques = db.Cheque.Include("Operacion").Include("Cliente").Where(x => x.fecha_deposito == fecha).ToList();
lista_cheques = lista_cheques.Where(x => x.banco.id_banco = banco).ToList();
lista_cheques = lista_cheques.Where(x => x.Operacion.Cliente.id_cliente = id_cliente).ToList();
翻訳:fechaは日付ですOperacionは小切手のグループですClienteはクライアントです。
このようにして、クエリを実行し、次にそのクエリ結果からクエリを実行し、次にその新しい結果から新しいクエリを実行します。
この方法では、パフォーマンスに大きな問題が発生する可能性があると思います。SQLサーバーがクエリを最適化することを知っています。したがって、断片化されたクエリを実行している場合、オプティマイザは正しく機能していません。
私が考えたもう1つの方法は、非常に面倒ですが、考えられるすべてのフィルター選択を処理する1つの大きなクエリを作成することです。
たとえば、他の例は次のようになります。
lista_cheques = db.Cheque.Include("Operacion").Include("Cliente").Where(x => x.fecha_deposito == fecha && x.banco.id_banco = banco && x.Operacion.Cliente.id_cliente = id_cliente).ToList();
大きな問題は、すべてのフィルターの可能性を処理できるようにするために、多くの組み合わせが必要になることです。
さて、最初のコード例でパフォーマンスの問題が発生しますか?そこでデータベースに対して1つの大きなクエリを実行し、次にオブジェクトのリストでクエリを実行します(これはより高速になると思います)。私はこのORMにかなり慣れていないので、このリストは多くのレジストリを処理する必要があります。
私は誰かが私にいくつかのアドバイスを与えることができますか?私はかなり混乱した説明をしました、あなたが理解できることを願っています。