我正在为汽车制造商,型号和引擎等的月度体积数据的相关集合创建4或5级的树形数据结构。尽管需要花费一分钟来构建它。有没有更快的方法呢?
var carData = (from manufacturer in manufacturerMonths.Select(m => m.Manufacturer).Distinct()
select new
{
ManufacturerData = (from manufacturerMonth in manufacturerMonths
.Where(t => t.Manufacturer == manufacturer)
select new
{
Date = manufacturerMonth.Date,
Volume = manufacturerMonth.Volume,
Models = new
{
ModelsData = (from model in modelMonths
.Where(m => m.Manufacturer == manufacturer)
.Select(m => m.Model).Distinct()
select new
{
ModelData = (from modelMonth in modelMonths
.Where(m => m.Model == model)
select new
{
Date = modelMonth.Date,
Volume = modelMonth.Volume,
Engines = new
{
EnginesData = (from engine in engineMonths
.Where(e => e.Model == model)
.Select(e => e.Engine).Distinct()
select new
{
EngineData = ....
}
}
}
}
}
}
}
}
答案 0 :(得分:1)
对每个外部语句项执行内部linq语句。它就像嵌套的foreach循环。因此,请确保不要反复处理相同的数据。使用词典时可能会提高性能:
E.g。 (只是为了表明我的意思,如果它错了就不要杀了我......)
而不是
EnginesData = (from engine in engineMonths
.Where(e => e.Model == model)
.Select(e => e.Engine).Distinct()
select new
{
EngineData = ....
}
在开头创建一个字典:
Dictionary<Model, Engine[]> modelToEnginesDict = engineMonths
.GroupBy(e => e.Model)
.ToDictionary(
x => x.Key,
x => x.Select(e => e.Engine).Distinct().ToArray())
并在linq语句中使用它:
EnginesData = (from engine in modelToEnginesDict[model]
select new
{
EngineData = ....
}
同时,您将大型查询拆分为较小的部分,对数据进行一些预处理。
答案 1 :(得分:0)
很多LINQ:O
恕我直言,尝试使用“拥有”继承的类层次结构。
LINQ是Lazy初始化的,并且会降低性能开销。 请参阅:Is a LINQ statement faster than a 'foreach' loop?
如果你可以编写自己的自定义代码来迭代List,你可以在某些情况下突破循环(如果你的设计真的可以实现)。这会有点痛苦,但在更长的时间内它会给你带来好处。
此外,代码将更容易调试,具有“新”(匿名)对象的LINQ深度很慢并且很难检查某些内容是否远离预期。