【发布时间】:2018-11-02 11:20:54
【问题描述】:
我目前正在将后端项目更新到 .NET Core,但我的 Linq 查询存在性能问题。
主要查询:
var queryTexts = from text in _repositoryContext.Text
where text.KeyName.StartsWith("ApplicationSettings.")
where text.Sprache.Equals("*")
select text;
var queryDescriptions = from text in queryTexts
where text.KeyName.EndsWith("$Descr")
select text;
var queryNames = from text in queryTexts
where !(text.KeyName.EndsWith("$Descr"))
select text;
var queryDefaults = from defaults in _repositoryContext.ApplicationSettingsDefaults
where defaults.Value != "*"
select defaults;
获得这些 IQueryables 后,我在另一个上下文中运行一个 foreach 循环来构建我的 DTO 模型:
foreach (ApplicationSettings appl in _repositoryContext.ApplicationSettings)
{
var applDefaults = queryDefaults.Where(c => c.KeyName.Equals(appl.KeyName)).ToArray();
description = queryDescriptions.Where(d => d.KeyName.Equals("ApplicationSettings." + appl.KeyName + ".$Descr"))
.FirstOrDefault()?
.Text1 ?? "";
var name = queryNames.Where(n => n.KeyName.Equals("ApplicationSettings." + appl.KeyName)).FirstOrDefault()?.Text1 ?? "";
// Do some stuff with data and return DTO Model
}
在我的旧项目中,这部分从大约 0.45 秒开始执行,现在我大约有 5-6 秒..
我考虑过使用编译查询,但我发现这些不支持返回 IEnumerable。我也试图避免 Contains() 方法。但无论如何它并没有提高性能。
您能否简要了解一下我的查询,并可能重构或提供一些提示如何使其中一个查询更快?
需要注意的是,_repositoryContext.Text 与其他上下文相比,由于翻译的原因,条目最多(约 50 000)。
【问题讨论】:
标签: sql .net entity-framework linq