【问题标题】:How to retrieve(get) huge amount of data using linq(Entity Framework 5) with faster time如何使用 linq(Entity Framework 5)更快地检索(获取)大量数据
【发布时间】:2016-03-07 20:21:56
【问题描述】:

我们数据库中的一个订单有大量记录(> 500,000)。当我试图获取所有记录并将它们映射到域模型时,它需要永远(linq 调用)。下面的示例代码将描述我所做的...

int OrderId = 123456;
int pagesize = 100;

using (var dbContext = new MyDbContext())
{
    var orderDetails = dbContext.orderDetailEntity
        .Where(i => i.Orders.OrderID == OrderId)
        .OrderBy(o => o.orderDetailStatus);

    var orderDetailModel = Mapper
        .Map<IEnumerable<OrderDetailModel>>(orderDetails.Take(PageSize));         
 }

更多信息 Orders 实体和 OrderDetail 实体有关系。因此,在上述查询中,我试图获取特定的所有 OrderDetail。但它会永远占用大量数据(超过 50 万条记录)。

你知道如何解决这个问题吗? 真的很感谢你

提前谢谢你。

【问题讨论】:

  • 不要将代码放入 cmets,edit your question 并将信息放在那里。此外,如果您将 Automapper 与 EntityFramework 一起使用,则不应使用 Mapper.Map,而应使用 Queryable ExtenstionsorderDetailModel = orderDetails.Take(PageSize).ProjectTo&lt;OrderDetailModel&gt;().ToList();
  • 你检查生成的SQL和查询执行计划了吗?您是否尝试过直接针对数据库运行该 SQL 并衡量其性能?
  • 你有延迟加载吗?我在 automapper 和延迟加载方面有过不好的体验 - 即 automapper 会触发导航属性加载
  • @Scott Chamberlain 问题出在 linq 调用上(Where 子句)
  • 你确定瓶颈是 EF 吗?您是否附上了个人资料以查看花费最多的时间?

标签: c# linq visual-studio asp.net-mvc-4 entity-framework-6


【解决方案1】:

根据经验,我再也不会使用 Linq 获得超过 10 万条记录。不久前我遇到过类似的情况,记录的数量相似,我会做的不同的一件事是使用原始 SQL 查询获取这么多的数据。

也就是说,我做了以下两件事,大大减少了执行时间: 1) 分页 - 无论您打算如何处理这些订单对象 - 尽可能使用分页 (.Skip .Take())

2) 如果订单对象仅用于在屏幕上显示信息,添加.AsNoTracking() 可以帮助减少执行时间。 (快速谷歌搜索可以概述原因)

    dbContext.orderDetailEntity
.AsNoTracking()
.Where(i => i.Orders.OrderID == OrderId)
.OrderBy(o => o.orderDetailStatus);

TL;DR 不要使用 Linq to Entities - 改用简单的 SQL 查询。

【讨论】:

  • Linq 本身不是问题,是实体框架造成的。
  • 我在一定程度上同意,但我还要说通过上下文运行 SQL 仍然可以将执行时间缩短十倍。
  • linq2sql 中的数据上下文实际上相当快。顺便说一句,它比在 SQL 管理工作室中查询要快。您可以通过 SqlDataReader 的硬连线实例将其击败 10%-30%,但您将很难编写更快的 Translate 函数的替代方案。我再说一遍,EF 是问题,而不是 linq。
猜你喜欢
  • 1970-01-01
  • 2013-04-24
  • 2021-04-28
  • 1970-01-01
  • 2010-09-23
  • 2021-09-13
  • 2013-10-30
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多