【发布时间】:2018-11-09 04:13:21
【问题描述】:
我们有以下方法允许我们在项目表中搜索 DataGrid:
public async Task<IEnumerable<Project>> GetFilteredProjects(string searchString)
{
var projects = _context.Projects.Where(p => p.Current);
projects.Include(p => p.Client);
projects.Include(p => p.Architect);
projects.Include(p => p.ProjectManager);
if (!string.IsNullOrEmpty(searchString))
{
projects = projects
.Where(p => p.NormalizedFullProjectName.Contains(searchString)
|| p.Client.NormalizedName.Contains(searchString)
|| p.Architect.NormalizedFullName.Contains(searchString)
|| p.ProjectManager.NormalizedFullName.Contains(searchString));
}
projects = projects.OrderBy(p => p.Name).Take(10);
return await projects.ToListAsync();
}
如果我们不在项目上使用Include,那么搜索是即时的。但是,将它们添加到搜索中后可能需要 3 秒以上。
我们需要包含其他实体,以便用户可以根据需要搜索它们。
我们如何能够提高性能但仍保留Include 以允许对其进行搜索?
如果没有Incldue,该方法如下所示:
public async Task<IEnumerable<Project>> GetFilteredProjects(string searchString)
{
var projects = _context.Projects.Where(p => p.Current);
if (!string.IsNullOrEmpty(searchString))
{
projects = projects
.Where(p => p.Name.Contains(searchString));
}
projects = projects.OrderBy(p => p.Name).Take(10);
return await projects.ToListAsync();
}
没有Include,性能如下:
与Include:
【问题讨论】:
-
查看任务管理器并检查内存使用情况。我怀疑 Include 会添加到您的内存中,并且发生交换会减慢运行时间。
-
您是否在 SQL 数据库上运行过跟踪?可能是您缺少索引或其他内容。
-
“我们需要包含其他实体以允许用户在他们想要的时候搜索它们”——我认为这不是真的。搜索(
Where子句)与包含无关。 -
NormalizedFullName 字段,这是否也作为字段存储在数据库中?我只是在这里猜测,但该字段可能没有被索引。当我处理人名搜索时,我会使用姓氏,然后可能是名字。
-
附注 - 在您的示例中
Includes 无效,因为您没有将返回的对象分配回projects变量。
标签: c# sql linq asp.net-core entity-framework-core