C# SQLite、Linq、Foreach:如何优化性能?

C# SQLite、Linq、Foreach:如何优化性能?,c#,performance,linq,sqlite,foreach,C#,Performance,Linq,Sqlite,Foreach,我开发了一个UWP应用程序,其中我使用SQLite数据库来存储同步的数据 在这些数据中,有许多表包含转换后的数据。例如,对于各种情况,我们有: 业务表,其中包含数据库中实际使用的id 翻译表,其中包含业务表的transaltion 业务表的模型定义如下: public class Failure_Type : BasePoco { [PrimaryKey, NotNull] public int failure_id { get; set; } public int?

我开发了一个UWP应用程序,其中我使用SQLite数据库来存储同步的数据

在这些数据中,有许多表包含转换后的数据。例如,对于各种情况,我们有:

业务表,其中包含数据库中实际使用的id 翻译表,其中包含业务表的transaltion 业务表的模型定义如下:

public class Failure_Type : BasePoco
{
    [PrimaryKey, NotNull]
    public int failure_id { get; set; }

    public int? function_type_id { get; set; }

    public int? component_category_id { get; set; }

    [MaxLength(200), NotNull]
    public string description { get; set; }
    public DateTime? disable_date { get; set; }

    [Ignore]
    public string _descriptionTr { get; set; }
}
public class Failure_Type_Translation : BasePoco
{
    [PrimaryKey, NotNull]
    public int failure_type_translation_id { get; set; }

    public int? failure_type_id { get; set; }
    [MaxLength(2)]
    public string language { get; set; }
    [MaxLength(200), NotNull]
    public string description { get; set; }
}
字段描述存储英文/默认描述,_descriptionontr字段将存储翻译后的描述

翻译表的模型定义如下:

public class Failure_Type : BasePoco
{
    [PrimaryKey, NotNull]
    public int failure_id { get; set; }

    public int? function_type_id { get; set; }

    public int? component_category_id { get; set; }

    [MaxLength(200), NotNull]
    public string description { get; set; }
    public DateTime? disable_date { get; set; }

    [Ignore]
    public string _descriptionTr { get; set; }
}
public class Failure_Type_Translation : BasePoco
{
    [PrimaryKey, NotNull]
    public int failure_type_translation_id { get; set; }

    public int? failure_type_id { get; set; }
    [MaxLength(2)]
    public string language { get; set; }
    [MaxLength(200), NotNull]
    public string description { get; set; }
}
字段failure\u type\u id与业务表相关,其他字段存储语言代码和相关翻译

因此,在同步SQLite数据库中的数据后,我在应用程序中刷新翻译后的数据,这可能需要很长时间。从SQLite加载这两个表的速度非常快,但_descriptionontr字段的更新速度可能非常慢:

var failureType = ServiceLocator.Current.GetInstance<IRepository>().GetAll<Failure_Type>();
var failureTypeTranslations = ServiceLocator.Current.GetInstance<IRepository>().GetAll<Failure_Type_Translation>();
FailureType = new ObservableCollection<Failure_Type>();
foreach (var ft in failureType)
{
    var ftt = failureTypeTranslations.FirstOrDefault(i => i.failure_type_id == ft.failure_id && i.language.ToLower().Equals(lang));
    if (ftt != null)
        ft._descriptionTr = ftt.description;
    else
        ft._descriptionTr = ft.description;
    FailureType.Add(ft);
}
有更好的方法吗? 我如何优化它

编辑:

业务表包含550行 翻译表包含3500行 循环的持续时间接近1分钟
有几点建议:

立即创建可观察的集合

FailureType = new ObservableCollection<Failure_Type>(failureType);
创建字典以查找已知翻译:

var dict = failureTypeTranslations.ToDictionary(ftt => ftt.failure_id);
foreach (var ft in FailureType)
{
     Failure_Type_Translation ftt;
     if (dict.TryGetValue(ft.failure_id, out ftt)
         ft._descriptionTr = ftt.description;
     else
         ft._descriptionTr = ft.description;
}

我认为,尤其是部件故障TypeTranslations.first或Default会降低性能。查询将针对循环的每个迭代执行。

谢谢@Get Arnold,通过结合您的建议,我将从1分钟缩短到半秒。