繁体   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