【发布时间】:2019-11-24 05:20:30
【问题描述】:
这是this question 的后续问题。你应该先读一下。
感谢this answer,我现在创建了一个可以返回正确条目的查询。见:
IQueryable<Data> onePerHour = dataLastWeek
.Where(d =>
!dataLastWeek
.Any(d2 =>
d2.ArchiveTime.Date == d.ArchiveTime.Date &&
d2.ArchiveTime.Hour == d.ArchiveTime.Hour &&
d2.ArchiveTime < d.ArchiveTime));
现在为了处理条目并将它们显示在图表上,我只需要模型类Data 的一两个属性。用例是这样的:
List<Data> actualData = onePerHour.ToList();
var tempCTupels = new List<TimeTupel<float>>();
tempCTupels.AddRange(actualData.Select(d => new TimeTupel<float>(d.ArchiveTime, d.TempC)));
var co2Tupels = new List<TimeTupel<float>>();
tempCTupels.AddRange(actualData.Select(d => new TimeTupel<float>(d.ArchiveTime, d.CO2Percent)));
TimeTupel 非常简单,定义如下:
public class TimeTupel<TData>
{
public TimeTupel(DateTime time, TData yValue)
{
Time = time;
YValue = yValue;
}
public DateTime Time { get; set; }
public TData YValue { get; set; }
}
问题
目前actualdata 是List<Data>,这意味着它已完全加载到内存中。
因为我只使用两个属性,所以我不需要检索整个对象来创建TimeTupels。
现在我的问题是如何实现性能提升?删除ToList 是正确的方法吗?
我尝试过的事情
-
仅使用
李>IQueryable<Data>创建TimeTupel:IQueryable<Data> actualData = onePerHour;产生运行时错误(“System.InvalidOperationException: 'Null TypeMapping in Sql Tree'”) 使用
AsEnumerable:IEnumerable<Data> actualData = onePerHour.AsEnumerable();很慢,10 天的数据大约需要 22 秒-
使用
李>ToList,如上面的代码所示(ToArray几乎相等):List<Data> actualData = onePerHour.ToList();更快,相同数量的数据大约需要 5 秒
【问题讨论】:
标签: c# performance linq entity-framework-core iqueryable