日安,
我有以下表格
父母1=>N子女1=>N孙辈。
这两个表都有超过30列。
我需要从父母那里选择超过50,000条记录,另外,我还需要孩子和孙辈的某些字段。需要在内存中操作数据(关于所选内容的复杂算法)。
我正在使用实体框架5。
我尝试了各种渴望加载(包括、投影等)的组合,但在以下场景中,我仍然无法使它比LINQ的perorms表现得更好:
“从项目中选择
关于每一行的绑定:从子女中选择从孙辈中选择
“
它至少生成50,001个对DB的调用,但它的性能仍然好于我的任何EF方法,后者接管x5的时间比当前的LINQ设计要长。
最好的解决方案是在子程序上使用WHERE查询,但在本机实现中的EF 5中不提供它(contains没有减少它--对于做得不好的.来说太慢了)。
任何想法都将受到极大的赞赏。
谢谢,
发布于 2013-10-02 16:48:51
我假设您是在网格视图中实现分页,而不是一次将数千行放入网格视图。如果是这样,则只能一次选择10行或在网格视图中显示的行数。这将是一个更容易的工作。
我在MSDN上找到了这个示例,它实现了分页服务器端,以减少单个查询中返回的行数。
您还可以考虑编写或让dba编写一个有效的存储过程,您可以将其链接到实体框架以控制SQL。
发布于 2013-10-02 17:05:29
几天前我也有过类似的问题。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-08 14:54:19
分页不起作用,因为我需要根据计算的字段对数据进行排序。该字段只能在web服务器内存中计算,因为计算需要客户端信息(是的,是的,有一种将此信息传递给db服务器的方法,但这不是一个选项)。
解决方案:使用(var onecontext =新的myCTx()) {从所有项目中选择所有项目,并在所有大子项目上实现Context.EntityName.SQLQuery(),使用良好的旧WHERE构造(我将所有这些内容作为扩展放入实体的部分类中)。
}
通过这种方式,我可以在N个db trips中获取所有数据,其中N是代数,这很好。然后EF上下文将所有内容连接在一起。然后我执行我所有的r
EF 6应该有in内置的地方,所以我想这个方法会变得更加明显。注意:对于大型数据,使用large ()不是一个选项,因为它会产生多个OR's,而不是直接输入。是的,然后ADO.NET将OR转换成IN,但在此之前,有一些非常繁重的工作正在进行,这将杀死应用程序服务器。
https://stackoverflow.com/questions/19142131
复制相似问题