EF 5大数据加载策略

时间:2013-10-02 16:37:31

标签: c# sql linq entity-framework

美好的一天,

我有以下表格

父母1 => N子女1 => N GRANDCHILDREN。

两个表都有超过30列。

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

我正在使用Entity Framework 5.

我尝试了各种Eager加载(包括,投影等)的组合,但是我仍然无法使它在下面的场景中使用LINQ-to-SQL执行得更好:

” 从PROJECTS中选择

关于每行的绑定: 从CHILDREN中选择 从GRANDCHILDREN中选择

它生成至少50,001个数据库调用,但它仍然比我的任何EF方法表现更好,它比当前的LINQ-to-SQL设计花费的时间长x5。

最好的解决方案是对子项进行WHERE IN查询,但在本机实现中不能在EF 5中使用(包含不会删除它 - 对于糟糕的操作来说太慢了......)。

任何想法将不胜感激。

谢谢,

3 个答案:

答案 0 :(得分:1)

我假设您正在网格视图中实现分页,并且不会立即将数千行放入网格视图中。如果是这样,您一次只能在网格视图中选择10行或多行。这将更容易使用。

我在MSDN上发现这个example实现了分页服务器端,以减少单个查询中返回的行数。

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

答案 1 :(得分:0)

前几天我有类似的问题。 EF非常慢。经过一些实验后,我通过直接查询获得了或多或少的正常表现:

使用所需字段创建ViewModel:

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();

答案 2 :(得分:0)

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

解决方案: 使用(var onecontext = new myCTx()) { 从PROJECTS中选择全部 并使用良好的旧WHERE IN构造在所有大孩子上实现Context.EntityName.SQLQuery()(我将它全部放入我的实体的部分类作为扩展)。

}

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

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