应用程序运行时,将运行多个查询。
现在,由于信息量增加了(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();
}
}
答案 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)
{
}
这说明代码是“如果有任何错误,我不想知道。”因此,如果您发现自己试图追查错误或奇怪的错误,请记住,您专门告诉代码不要告诉您是否出了什么问题:)
至少,将异常捕获到变量中并将其记录在某个地方。或者根本不捕获异常,而让异常在堆栈中冒泡,从而可以有意义地捕获和处理异常。