2

タイトルが示すように、私は金融アプリケーションにエンティティフレームワーク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にかなり慣れていないので、このリストは多くのレジストリを処理する必要があります。

私は誰かが私にいくつかのアドバイスを与えることができますか?私はかなり混乱した説明をしました、あなたが理解できることを願っています。

4

1 に答える 1

5
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();

ほぼ完璧。それらすべてのToListを殺すと、それは良いことです。

ToListは、SQLが評価されることを意味するため、3つのフィルターすべてがトリガーされると、2と3がメモリ内で評価されます。

ToListを削除すると、さまざまなWhere句がデータベースで結合されます。

標準のLINQ101。チャームのように機能し、いつでも見栄えがします。

次に、最後の行として追加します。

lista_cheques = lista_cheques.ToList();

于 2013-01-23T15:29:27.123 に答える