通过“开始时运行查询”更快地运行应用程序

时间:2018-12-10 18:31:35

标签: c# performance entity-framework async-await

应用程序运行时,将运行多个查询。

现在,由于信息量增加了(SQLite数据库大小为500 KB),该程序以5秒的延迟运行。我应该怎么做才能更快地运行该应用程序?

这是我编写的代码:

public void getInitialData()
{
    try
    {
        using (var db = new DataClass.myDbContext())
        {
            var query = db.Schools.ToList();
            txtScCount.Text = query.Count().ToString();
            var query2 = db.Users.ToList();
            txtUCount.Text = query2.Count().ToString();
            var query3 = db.Students.ToList();
            txtStCount.Text = query3.Count().ToString();
        }
    }
    catch (Exception)
    {
    }
}

private void getSchool()
{
    try
    {
        using (var db = new DataClass.myDbContext())
        {
            var query = db.Schools.Select(x => x);
            if (query.Any())
            {
                cmbEditBase.ItemsSource = query.ToList();
            }
        }
    }
    catch (Exception)
    {
    }
}

private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
    getInitialData();
    getSchool();
    cmbEditBase.SelectedIndex = Convert.ToInt32(FindElement.Settings.DefaultSchool);
    getTopStudent(Convert.ToInt64(cmbEditBase.SelectedValue));

    try
    {
        using (var db = new DataClass.myDbContext())
        {
            long baseId = Convert.ToInt64(cmbEditBase.SelectedValue);
            var query = db.Scores.Join(
               db.Students,
               c => c.StudentId,
               v => v.Id,
               (c, v) => new DataClass.DataTransferObjects.StudentsScoresDto { Id = c.Id, BaseId = v.BaseId, StudentId = v.Id, Name = v.Name, LName = v.LName, FName = v.FName, Scores = c.Scores }
           ).Where(y => y.BaseId == baseId).ToList();
    }
}

1 个答案:

答案 0 :(得分:4)

不要将整个表 装入内存:

var query = db.Schools.ToList();
txtScCount.Text = query.Count().ToString();

如果您只需要记录数,那么只需获取记录数即可:

txtScCount.Text = db.Schools.Count().ToString();

Let Entity Framework可帮助您针对数据库引擎优化数据查询。数据库引擎在优化查询执行路径方面非常出色。不要只是将整个数据库加载到内存数组中并尝试优化自己。

除此之外,您显示的代码实际上没有任何繁重的操作。确保明确确认实际瓶颈在哪里。我会毫不犹豫地假设它来自仅500KB的数据。在海量数据的规模上,500KB数据与没有数据是无法区分的。


旁注:您可能不应该这样做:

catch (Exception)
{
}

这说明代码是“如果有任何错误,我不想知道。”因此,如果您发现自己试图追查错误或奇怪的错误,请记住,您专门告诉代码不要告诉您是否出了什么问题:)

至少,将异常捕获到变量中并将其记录在某个地方。或者根本不捕获异常,而让异常在堆栈中冒泡,从而可以有意义地捕获和处理异常。