1

再会,

我有以下表格

父母 1=>N 个孩子 1=>N 个孙子。

两个表都有超过 30 列。

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

我正在使用实体框架 5。

我尝试了急切加载(包括、投影等)的各种组合,但我仍然无法使其性能更好,然后在以下场景中使用 LINQ-to-SQL 执行:

" 从项目中选择

在每一行的绑定上: SELECT from CHILDREN SELECT from GRANDCHILDREN

"

它生成至少 50,001 次对 DB 的调用,但它的性能仍然比我的任何 EF 方法都要好,它比当前的 LINQ-to-SQL 设计长 x5 倍。

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

任何想法将不胜感激。

谢谢,

4

3 回答 3

1

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

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

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

于 2013-10-02T16:48:51.630 回答
0

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

解决方案: using(var onecontext = new myCTx()) { SELECT all from PROJECTS 并在所有孙子上实现 Context.EntityName.SQLQuery() ,使用良好的旧 WHERE IN 构造(我将其全部放入我实体的部分类中扩展名)。

}

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

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

于 2013-10-08T14:54:19.447 回答
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();
于 2013-10-02T17:05:29.520 回答