【问题标题】:Entity Framework Query filters implementation for best perfomance实体框架查询过滤器实现以获得最佳性能
【发布时间】:2013-01-23 23:29:27
【问题描述】:

正如标题所说,我将实体框架 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 是日期 操作是一组检查 客户就是客户。

通过这种方式,我正在执行一个查询,然后从该查询结果中进行一个查询,然后从该新结果中进行一个新查询,然后继续。

我认为这种方式可能存在很大的性能问题。我知道 SQL 服务器优化查询。所以,如果我在做碎片查询,优化器就不能正常工作。

我想过但非常乏味的另一种方法是创建一个大查询来处理所有可能的过滤器选择。

例如,另一个例子是这样的:

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 很陌生,这个清单将不得不处理很多注册表..

有人可以给我一些建议吗?解释的有点乱,希望你能理解..

【问题讨论】:

  • 我认为这种方式可能会有很大的性能问题 - 不要思考,衡量。首先查看生成的实际 SQL。我希望这能正常工作。

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


【解决方案1】:
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 ();

【讨论】:

  • 对。没看到ToList()s,懒得滚动了。
  • 感谢您的回答!那么,如果我最后不写 ToList(),SQL 仍在评估查询吗?我不知道。问题是 lista_cheques 是一个列表。我将不得不创建一个新变量来存储查询。对吗?
  • 是的,但是您在最后实现了列表。首先将所有条件放在一起,然后在最后一步添加“ToList”。 ToList 强制执行 sql,然后在每个附加的地方发生客户端。
  • 答案非常好,速度非常快。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多