美好的一天,
我有以下表格
父母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中使用(包含不会删除它 - 对于糟糕的操作来说太慢了......)。
任何想法将不胜感激。
谢谢,
答案 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,但在此之前有一些非常繁重的工作正在完成,这会杀死您的应用服务器。