C# SQLite、Linq、Foreach:如何优化性能?
我开发了一个UWP应用程序,其中我使用SQLite数据库来存储同步的数据 在这些数据中,有许多表包含转换后的数据。例如,对于各种情况,我们有: 业务表,其中包含数据库中实际使用的id 翻译表,其中包含业务表的transaltion 业务表的模型定义如下: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?
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分钟缩短到半秒。