簡體   English   中英

實體框架查詢過濾器實現最佳性能

[英]Entity Framework Query filters implementation for best perfomance

如標題所述,我正在將實體框架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 Server優化查詢。 因此,如果我正在執行零散查詢,那么優化器將無法正常工作。

我想到的另一種方法卻很繁瑣,那就是創建一個大查詢來處理所有可能的過濾器選擇。

例如,另一個示例將如下所示:

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

最大的問題是,我將需要大量組合才能處理所有過濾條件。

好的,現在,我在第一個代碼示例中會遇到性能問題嗎? 我在那里對數據庫做一個大查詢,然后在對象列表中進行查詢(我認為這樣會更快)。 我對這個ORM來說還很陌生,這個清單必須要處理很多注冊表。

我有人可以給我一些建議嗎? 我講得一團糟,希望您能理解。

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個flter觸發器均被評估,則將在內存中評估2和3。

踢掉ToList,然后將不同的Where子句合並到數據庫中。

標准LINQ101。工作就像一個吊飾,總是很高興看到。

然后添加為LAST行:

lista_cheques = lista_cheques.ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM