簡體   English   中英

使用LINQ在.NET Core中查詢多個IQueryable的性能

[英]Query Performance for multiple IQueryable in .NET Core with LINQ

我目前正在將BackEnd項目更新為.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)。

queryNames,queryDefaults和queryDescriptions都是查詢而不是集合。 而你正在循環運行它們。 嘗試將它們加載到循環外部。

例如:將queryNames加載到字典:

var queryNames = from text in queryTexts
                         where !(text.KeyName.EndsWith("$Descr"))
                         select text;
var queryNamesByName = queryName.ToDictionary(n => n.KeyName);

可以寫下面的查詢

var Profile="developer"; 
var LstUserName = alreadyUsed.Where(x => x.Profile==Profile).ToList();   

你也可以像下面這樣使用“foreach”

lstUserNames.ForEach(x=>
                        {
                           //do your stuff
                        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM