美好的一天,
我有下表
父级 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,但在此之前,需要完成一些非常繁重的工作,这会杀死您的应用程序服务器。