如何在ASP.NET MVC视图中处理IQueryables?

时间:2011-07-07 19:30:25

标签: mysql linq-to-sql asp.net-mvc-3 mvccontrib-grid

我在MySQL数据库中有一些表来表示来自传感器的记录。我正在开发的系统的一个功能是将这些记录从数据库显示给Web用户,所以我使用ADO.NET实体数据模型创建一个ORM,使用Linq to SQL从数据库中获取数据,并将它们存储在我设计的ViewModel中,因此我可以使用MVCContrib Grid Helper显示它:

public IQueryable<TrendSignalRecord> GetTrends()
{
    var dataContext = new SmgerEntities();
    var trendSignalRecords = from e in dataContext.TrendSignalRecords
                select e;

    return trendSignalRecords;
}

public IQueryable<TrendRecordViewModel> GetTrendsProjected()
{
    var projectedTrendRecords = from t in GetTrends()
    select new TrendRecordViewModel
    {
        TrendID = t.ID,
    TrendName = t.TrendSignalSetting.Name,
    GeneratingUnitID = t.TrendSignalSetting.TrendSetting.GeneratingUnit_ID,
    //{...}
    Unit = t.TrendSignalSetting.Unit
    };
    return projectedTrendRecords;
}

我调用GetTrendsProjectedMethod然后使用Linq to SQL来仅选择我想要的记录。它在我的开发场景中运行良好,但是当我在真实场景中测试它时,记录的数量更大(大约一百万条记录),它就会停止工作。

我放了一些调试消息来测试它,一切正常,但当它到达return View()语句时,它只是停止,给我一个MySQLException:Timeout expired。这让我想知道我发送到页面的数据是否被页面本身检索(它只在页面本身需要时搜索数据库中显示的项目,或类似的东西)。

我的所有其他页面都使用相同的工具集:MVCContrib Grid Helper,ADO.NET,Linq to SQL,MySQL,以及其他一切工作正常。

2 个答案:

答案 0 :(得分:1)

如果您有数百万条记录,则绝对应该在执行查询之前对数据集进行分页。这可以使用.Skip.Take扩展方法完成。在对数据库运行任何查询之前,应该调用它们。

尝试在没有分页的情况下从数据库中获取数百万条记录很可能会导致超时。

答案 1 :(得分:1)

好吧,假设this blog中的信息正确无误,.AsPagination方法要求您按特定列对数据进行排序。尝试在包含数百万条记录的表上执行OrderBy可能只是耗时的操作并且超时。