实体框架查询过滤实现以获得最佳性能

时间:2013-01-23 15:25:34

标签: c# winforms performance entity-framework-4

正如标题所说,我将实体框架4.0用于财务应用程序。我有一个winform,我列出了我的所有支票(支票)。但在这种形式下,用户可以指定一些过滤器。

enter image description here

如果用户没有应用任何过滤器,我可以像这样进行查询:

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的新手,这个列表必须处理很多注册表..

我有人可以给我一些建议吗?我解释得非常糟糕,希望你能理解......

1 个答案:

答案 0 :(得分: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子句合并到数据库中。

标准LINQ 101.像魅力一样,总是很好看。

然后添加为最后一行:

lista_cheques = lista_cheques.ToList();