正如标题所说,我将实体框架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的新手,这个列表必须处理很多注册表..
我有人可以给我一些建议吗?我解释得非常糟糕,希望你能理解......
答案 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();