【问题标题】:how to convert type 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Collections.Generic.IEnumerable<>'.如何将类型“System.Collections.Generic.IEnumerable<AnonymousType#1>”转换为“System.Collections.Generic.IEnumerable<>”。
【发布时间】:2017-12-17 15:28:17
【问题描述】:

我需要将以下linq直接转换为List,如果我将其转换为列表,我仍然会收到我在主题上解释的错误,它说我需要将它转换为列表,但仍然存在错误,如何我可以将其转换为字符串列表吗?不使用 foreach 等额外的转换,...​​

List<string>  eventResult= (from c in DB.Events
                        where (c.m_turbine_id == turbineid.turbineID) && (c.m_time_stamp >= frmDate && c.m_time_stamp <= toDate)

                 select new EventLogPartialViewModel
                 {
                     Timestamp = c.m_time_stamp,
                     Description = c.m_event_log_description,
                     WindSpeed = c.m_wind_speed,
                     RPM = c.m_rpm,
                     Power = c.m_power
                 }).ToList().Select(x => new
                           {
                               Timestamp = x.Timestamp.ToString("dd/MM/yyyy H:mm:ss"),
                               Description = x.Description,
                               WindSpeed = x.WindSpeed,
                               RPM = x.RPM,
                               Power = x.Power
                           }).ToList().OrderByDescending(m => m.Timestamp);

上述linq的第一部分,我获取数据并转换为列表,因为我需要更改我的时间戳格式,任何帮助将不胜感激。

【问题讨论】:

  • 你为什么不投射到具体的类型?
  • 您打算如何在string 中表示具有五个属性的对象?
  • @JLRishe 是的,因为我需要从中获取一个 csv 文件,并且为了转换为字节,我需要字符串列表 –
  • 好的,所以您的问题应该是关于如何将任意对象转换为 CSV。所有 Linq 的东西都让人分心。
  • @JLRishe 是的,但我需要得到一个字符串列表,对吗?或者我的方向不对?

标签: c# linq


【解决方案1】:

因为您需要创建带有标题的逗号分隔值列表,

//Add headers as first item
List<string>  eventResult = new List<string>(){"Timestamp,Description,WindSpeed,RPM,Power"};

//Add records
eventResult.AddRange(from c in DB.Events
                        where (c.m_turbine_id == turbineid.turbineID) && (c.m_time_stamp >= frmDate && c.m_time_stamp <= toDate)

                 select new EventLogPartialViewModel
                 {
                     Timestamp = c.m_time_stamp,
                     Description = c.m_event_log_description,
                     WindSpeed = c.m_wind_speed,
                     RPM = c.m_rpm,
                     Power = c.m_power
                 }).ToList().Select(x => 
                      x.Timestamp.ToString("dd/MM/yyyy H:mm:ss")) + "," +
                      x.Description + "," +
                      x.WindSpeed + "," +
                      x.RPM + "," +
                      x.Power

                 .ToList());

【讨论】:

  • 不,我需要所有这些,这只是给我时间戳
  • 你需要逗号分隔值吗?
  • 是的,因为我需要从中获取一个 csv 文件,并且为了转换为字节,我需要字符串列表
  • 检查更新的答案,它将返回逗号分隔值
  • 很好,但我这里没有标题的名称,我只有你的解决方案的值,例如:描述,时间戳......不在那里,我也需要它们以防万一导出到 csv
【解决方案2】:

在 Linq 查询中,您选择了匿名复杂类型,因此您无法为其分配 List&lt;string&gt;。您应该使用var 来保留匿名类型的引用。

var eventResult= (from c in DB.Events
                        where (c.m_turbine_id == turbineid.turbineID) && (c.m_time_stamp >= frmDate && c.m_time_stamp <= toDate)

                 select new EventLogPartialViewModel
                 {
                     Timestamp = c.m_time_stamp,
                     Description = c.m_event_log_description,
                     WindSpeed = c.m_wind_speed,
                     RPM = c.m_rpm,
                     Power = c.m_power
                 }).ToList().Select(x => new
                           {
                               Timestamp = x.Timestamp.ToString("dd/MM/yyyy H:mm:ss"),
                               Description = x.Description,
                               WindSpeed = x.WindSpeed,
                               RPM = x.RPM,
                               Power = x.Power
                           }).OrderByDescending(m => m.Timestamp).ToList();

另外,理想的方法是为复杂类型创建一个类来处理引用,而不是使用匿名类型。

【讨论】:

  • 我使用了 var,但需要字符串列表,因为我想将它们全部转换为字节,然后下载为 csv 文件,这就是我的观点
  • 我建议您将记录检索为复杂类型类后转换为.csv文件。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 2015-06-12
  • 1970-01-01
  • 2011-05-14
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多