SQLite,Linq,Foreach:如何优化表现?

时间:2017-03-29 10:54:09

标签: c# performance linq sqlite foreach

我开发了 UWP应用,我使用 SQLite 数据库来存储已同步的数据。

在这些数据中,有很多表包含翻译数据。例如,对于各种情况,我们有:

  • a" 业务" table,包含数据库中真正使用的id
  • a" 翻译"表,其中包含业务表的转换

" 业务"的模型表定义如下:

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);
}

有更好的方法吗? 我该如何优化它?

编辑:

  • &#34; business&#34;表包含550行
  • &#34;翻译&#34;表包含3500行
  • 循环的持续时间接近1分钟

1 个答案:

答案 0 :(得分:1)

一些建议:

  1. 一次创建可观察的集合......

    FailureType = new ObservableCollection<Failure_Type>(failureType);
    

    ...所以个别添加内容不会发出通知。现在在循环中使用FailureType

  2. 不是抓取所有翻译,而是按lang

    过滤它们
    var failureTypeTranslations = ServiceLocator.Current.GetInstance<IRepository>()
        .GetAll<Failure_Type_Translation>()
        .Where(l => i.language == lang);
    
  3. 创建用于查找已知翻译的字典:

    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;
    }
    
  4. 我认为特别是部分failureTypeTranslations.FirstOrDefault杀死了表现。查询将在循环的每次迭代中执行。