[英]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.