将1000s ExpandoOject / dynamic转换为静态类型需要永远

时间:2017-12-13 07:41:07

标签: c# .net performance dynamic expandoobject

我正在尝试将1000s动态列表(我从CsvHelper读取csv文件)转换为静态类型,但它将永远占用。

这是代码:

动态对象

      MyObj {
               id =1, prop1=1,prop2=2,prop3=3...
            }

结果

           PObj1 { oid = 1 , name = "Property 1", value = "1" }
           PObj2 { oid = 1 , name = "Property 2", value = "2" }
           PObj3 { oid = 1 , name = "Property 3", value = "3" }

要转换的代码

 var imp = rows.SelectMany(x => map.Keys.ToList().Select(k => new PObj
      {
          OID = (((IDictionary<string, object>)x)["oid"] ?? "").ToString(),
          Name = k,
          Value = ToDate((((IDictionary<string, object>)x)[map[k]] ?? "").ToString())
      }).ToList()).ToList();

地图包含大约40-50的属性列表

map<string,string>{
                   {"Property 1","prop1"},
                   {"Property 1","prop2"},
                   {"Property 1","prop3"}
                    ...
}

ToDate功能

private DateTime? ToDate(string strDate)
        {
            strDate = strDate.Split(' ')[0];
            strDate = strDate.Replace('-', '/').Replace('.', '/');
            DateTime? dt = null;
            try
            {
                dt = DateTime.ParseExact(strDate, dateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None);
            } catch { }
            return dt;
        }

map可以包含任意数量的peroperties,因此expandoObject将具有动态数量的属性。

有什么方法可以提高性能吗?

我需要进行此转换的原因是因为我需要将此作为表发送到存储过程,因此如果对象中的数字属性发生更改,则将expandoObject直接转换为表会产生问题,因为此平均列数也将在表中更改。

如果在上述情况下工作,我也愿意接受其他解决方案。

1 个答案:

答案 0 :(得分:0)

好像是我的电脑(在Mac上运行Windows)。相同的代码现在可以正常工作

 rows.ToList().ForEach(x => imps.AddRange(map.Keys.Select(k => new ImportMilestone
                    {
                        JVSiteID = (((IDictionary<string, object>)x)[siteid] ?? "").ToString(),
                        Milestone = k,
                        MilestoneValue = ToDate((((IDictionary<string, object>)x)[map[k]] ?? "").ToString())
                    }).ToList()));