mysql - ASP.NET MVC View 中如何处理 IQueryables?

标签 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,其他一切都正常。

最佳答案

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

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

关于mysql - ASP.NET MVC View 中如何处理 IQueryables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6616016/

相关文章:

asp.net-mvc - 在 ASP.NET MVC 3 中使用 WebGrid 显示原始 HTML

mysql - 带有 LEFT JOIN 的 MySQL SELECT 中的空行

php - LOAD DATA INFILE - mysql/php 脚本无法正常运行

mysql - Union 之后的搜索查询

c# - Linq 检查字段类型是数字还是字符串

.net - 法国色情网址将 404 错误记录到非色情网站

mysql - 无法检索sql语句中的行

sql - 在 System.Data.Linq.DataContext 对象上重新编译查询提示

sql-server - LINQ to SQL 数据上下文日志不显示 WHERE 子句

c# - 如何在使用 Razor 将文件上传到 MVC 3 中的 App_Data/Uploads 后查看文件?