我开发了 UWP应用,我使用 SQLite 数据库来存储已同步的数据。
在这些数据中,有很多表包含翻译数据。例如,对于各种情况,我们有:
" 业务"的模型表定义如下:
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; }
}
字段" 说明 "存储英语/默认描述," _descriptionTr "字段将存储已翻译的说明。
" 翻译的模型"表定义如下:
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_type_id "与业务表相关,其他字段存储语言代码和相关翻译。
因此,在SQLite数据库中同步数据后,我刷新"翻译"应用程序中的数据,这可能需要很长时间。来自SQLite的2个表的加载非常快,但更新了" _descriptionTr "字段可能很慢:
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);
}
有更好的方法吗? 我该如何优化它?
编辑:
答案 0 :(得分:1)
一些建议:
一次创建可观察的集合......
FailureType = new ObservableCollection<Failure_Type>(failureType);
...所以个别添加内容不会发出通知。现在在循环中使用FailureType
。
不是抓取所有翻译,而是按lang
:
var failureTypeTranslations = ServiceLocator.Current.GetInstance<IRepository>()
.GetAll<Failure_Type_Translation>()
.Where(l => i.language == lang);
创建用于查找已知翻译的字典:
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;
}
我认为特别是部分failureTypeTranslations.FirstOrDefault
杀死了表现。查询将在循环的每次迭代中执行。