sqlite查询速度慢,如何优化(使用linq实体)

时间:2015-06-22 14:41:14

标签: c# linq entity-framework sqlite

我使用MS SQL服务器几次,并且在使用linq实体查询时还没有遇到速度问题。这次,我使用的是sqlite,以便将整个数据库与应用程序一起发送。

我有一个包含4个搜索字段的winforms应用。我的目标是设计搜索,使结果反映单个字段或多个字段(根据哪些字段具有搜索词构建查询)。

目前,我的查询有效,但需要花费大量时间来对sqlite数据库执行操作。特别是,在第一次运行。我假设这是因为sqlite后面没有强大的服务器,结果在本地处理并加载到内存中。我认为数据库正在索引自己,或者必须在第一次构建某种缓存。

如何优化我的linq查询到sqilte,我不一定将整个表加载到内存中然后约束结果但是在加载表时约束结果?

    public List<ResultGridviewModel> GetChartsFromSearch(string patientID, string firstName, string lastName, DateTime? dateOfBirth)
    {
        using (var _dataContext = new dbEntities())
        {

            var records = (from c in _dataContext.charts
                          select new ResultGridviewModel 
                          {
                              AltID = c.AltID,
                              FirstName = c.FirstName,
                              LastName = c.LastName,
                              DateOfBirth = c.DateOfBirth,
                              Description = c.Description,
                              ServiceDateTime = c.ServiceDateTime
                          });


            // AltID (PatientID)
            if (!string.IsNullOrEmpty(patientID))
            {
                records = records.Where(x => x.AltID.Contains(patientID.Trim().ToUpper()));
            }

            // First Name
            if (!string.IsNullOrEmpty(firstName))
            {
                records = records.Where(x => x.FirstName.Contains(firstName.Trim().ToUpper()));
            }

            // Last Name
            if (!string.IsNullOrEmpty(lastName))
            {
                records = records.Where(x => x.LastName.Contains(lastName.Trim().ToUpper()));
            }

            // Date Of Birth
            if (dateOfBirth != null)
            {
                records = records.Where(x => x.DateOfBirth == dateOfBirth);
            }


            return records.ToList();
        }
    }

我已将索引应用于数据库中的这些字段,但我觉得问题出在我的查询中。重构优化的任何建议?

截至目前,数据库的记录约为350,000,并且可能会变大。最后,我将停止向其添加记录,但我们假设粗略估计它将有~7万条记录

1 个答案:

答案 0 :(得分:3)

最大的优化是将Contains更改为StartsWith。这相当于从name like '%search%'更改为name like 'search%'。否则,SQLite无法完全使用您在列上放置的索引,而您基本上是在搜索整个表。

// First Name
if (!string.IsNullOrEmpty(firstName))
{
  firstName = firstName.Trim().ToUpper();
  records = records.Where(x => x.FirstName.StartsWith(firstName));
}