EF 5 大数据加载策略



美好的一天,

我有下表

父级 1=>N 个子项 1=>N 个孙子。

两个表都有 30 多列。

我需要从 PARENT 中选择超过 50,000 条记录,此外,我需要来自 CHILDREN 和 GRANDCHILDREN 的某些字段。需要数据在内存中进行操作(所选内容的复杂算法(。

我正在使用实体框架 5。

我尝试了各种 Eager 加载组合(包含、投影等(,但我仍然无法使其性能更好,然后在以下情况下使用 LINQ-to-SQL 进行:

"从项目中选择

在每行的绑定时:从儿童中选择从孙子孙女中选择

">

它至少生成了 50,001 次对数据库的调用,但它的性能仍然比我的任何 EF 方法都要好,这些方法比当前的 LINQ-to-SQL 设计占用 x5 以上的时间。

最好的解决方案是对子项进行 WHERE IN 查询,但它在本机实现中的 EF 5 中不可用(包含不会削减它 - 太慢了,做得不好......

任何想法将不胜感激。

谢谢

我假设您正在网格视图中实现分页,而不是一次将数千行放入网格视图中。 如果是这样,则一次只能选择 10 行或任意数量的行显示在网格视图中。 这将更容易使用。

我在 MSDN 上找到了此示例,该示例实现了分页服务器端以减少单个查询中返回的行数。

还可以考虑编写或让 dba 编写一个高效的存储过程,您可以将其链接到实体框架以控制 SQL 代码。

几天

前我遇到了类似的问题。EF 非常慢。经过一些实验,我收到了或多或少的正常性能,直接查询:

使用所需字段创建视图模型:

public class MyViewModel
{
  public string one {get; set;}
  public string two {get; set;}
}

然后在控制器操作中:

MyViewModel result = db.Database.SqlQuery<MyViewModel>
                    ("SELECT a.one, b.two" +
                    " FROM Table1 a, Table2 b" +
                    " WHERE a.id == somthing"
                    ).FirstOrDefault();

分页不起作用,因为我需要根据计算字段对数据进行排序。该字段只能在 Web 服务器内存中计算,因为计算需要客户端信息(是的,是的,有一种方法可以将此信息传递给数据库服务器,但这不是一个选项(。

溶液:using(var onecontext = new myCTx((({从项目中全选并在所有孙子级上实现 Context.EntityName.SQLQuery((,使用老式的 WHERE IN 构造(我将其全部作为扩展放入实体的部分类中(。

}

这样,我以 N db 行程的形式获取所有数据,其中 N 是世代数,这很好。然后,EF 上下文将所有内容连接在一起。然后我执行我所有的 r

EF 6 应该内置 WHERE IN,所以我想这种方法会变得更加明显。请注意:使用 Contains(( 不是大数据的选项,因为它会产生多个 OR 而不是直接输入。是的,ADO.NET 然后将OR转换为IN,但在此之前,需要完成一些非常繁重的工作,这会杀死您的应用程序服务器。

最新更新