And*_*res 2 c# performance winforms entity-framework-4
正如标题所说,我将实体框架4.0用于财务应用程序.我有一个winform,我列出了我的所有支票(支票).但在该形式中,用户可以指定一些过滤器.

如果用户没有应用任何过滤器,我可以像这样进行查询:
lista_cheques = db.Cheque.Include("Operacion").Include("Cliente").ToList();
datagridview.Datasource = lista_cheques;
Run Code Online (Sandbox Code Playgroud)
这很简单.但是当它应用过滤器时,问题会变得更大.
如您所见,用户可以使用过滤器查看特定客户的检查(检查),日期,银行,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();
Run Code Online (Sandbox Code Playgroud)
翻译: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();
Run Code Online (Sandbox Code Playgroud)
最大的问题是我需要很多组合才能处理所有过滤器的可能性.
好的,现在,我会在第一个代码示例中遇到性能问题吗?我在那里对数据库做了一个大的查询,然后我在对象列表中进行查询(我认为会更快).我是这个ORM的新手,这个列表必须处理很多注册表..
我有人可以给我一些建议吗?我弄得很乱,希望你能理解......
小智 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();
Run Code Online (Sandbox Code Playgroud)
几乎完美.杀死所有那些ToList,这很好.
ToList意味着评估SQL,因此如果所有3个flters触发,则在内存中评估2和3.
踢掉ToList,并将不同的Where子句组合在数据库上.
标准LINQ 101.像魅力一样,总是很好看.
然后添加为最后一行:
lista_cheques = lista_cheques.ToList();