gpt4 book ai didi

c# - Linq to Entities 中是否有一种有效的中间计算方法

转载 作者:行者123 更新时间:2023-11-30 12:15:09 25 4
gpt4 key购买 nike

我有这个在幕后使用 LinqToEntities 的查询。

(...)
.GroupBy(x => x.FahrerID)
.Select(x => new FahrerligaEintrag()
{
FahrerID = x.Key,
FahrerFullName = string.Empty,
VollgasKmAufHundertKm = (100m / x.Sum(y => y.BasisMeter)) * (x.Sum(y => y.Gas100ProzentInMeter.Value) + x.Sum(y => y.Gas90ProzentInMeter.Value)),
LeerlaufInProzent = (100m / x.Sum(y => y.BasisSekunden)) * x.Sum(y => y.LeerlaufInSekunden.Value),
VerbrauchLiterAufHundertKm = (100m / x.Sum(y => y.BasisMeter)) * x.Sum(y => y.VerbrauchInLiter.Value) * 1000,
RollenKmAufHundertKm = (100m / x.Sum(y => y.BasisMeter)) * x.Sum(y => y.RollenInMeter.Value),
TempomatKmAufHundertKm = (100m / x.Sum(y => y.BasisMeter)) * x.Sum(y => y.TempomatInMeter.Value),
GeschwindigkeitsuebertretungenAnzahlAufHundertKm = (100m / x.Sum(y => y.BasisMeter)) * 1000 * x.Sum(y => y.UebertretungenAnzahl.Value),
GangwechselAnzahlAufHundertKm = (100m / x.Sum(y => y.BasisMeter)) * 1000 * x.Sum(y => y.GangwechselAnzahl.Value)
});

如您所见,这部分重复了几次(100m/x.Sum(y => y.BasisMeter))

在Linq to Objects中感觉很自然的先投影到一个匿名类中去计算因子,避免重复计算。像这样:

.GroupBy(x => x.FahrerID)
.Select(x => new
{
Grouping = x,
BasisMeterFaktor = 100m / x.Sum(y => y.BasisMeter),
BasisSekundenFaktor = 100m /x.Sum(y => y.BasisSekunden)
})
.Select(x => new FahrerligaEintrag()
{
FahrerID = x.Grouping.Key,
FahrerFullName = string.Empty,
VollgasKmAufHundertKm = x.BasisMeterFaktor * (x.Grouping.Sum(y => y.Gas100ProzentInMeter.Value) + x.Grouping.Sum(y => y.Gas90ProzentInMeter.Value)),
LeerlaufInProzent = x.BasisSekundenFaktor * x.Grouping.Sum(y => y.LeerlaufInSekunden.Value),
VerbrauchLiterAufHundertKm = x.BasisMeterFaktor * x.Grouping.Sum(y => y.VerbrauchInLiter.Value) * 1000,
RollenKmAufHundertKm = x.BasisMeterFaktor * x.Grouping.Sum(y => y.RollenInMeter.Value),
TempomatKmAufHundertKm = x.BasisMeterFaktor * x.Grouping.Sum(y => y.TempomatInMeter.Value),
GeschwindigkeitsuebertretungenAnzahlAufHundertKm = x.BasisMeterFaktor * 1000 * x.Grouping.Sum(y => y.UebertretungenAnzahl.Value),
GangwechselAnzahlAufHundertKm = x.BasisMeterFaktor * 1000 * x.Grouping.Sum(y => y.GangwechselAnzahl.Value)
});

但是,在 LinqToEntities 中,这会导致 SQL 代码性能不佳。至少对于我使用的这个 Oracle 后端(我无法分析它以实际向我展示 SQL)。所以,我想知道是否有另一种方法可以避免重复计算,或者这是否是我可以获得的最快方法。

请原谅所有这些德语变量名称。我相信您仍然明白其中的含义。

更新

我能够按照建议使用 ToTraceString()。有趣的是,通过投影,SQL 包含 18 (!!!) SELECT 语句。没有它,它只包含 2 个。

最佳答案

在查询上执行的 .ToTraceString() 是否提供了一个您可以分析的 SQL 查询?很容易迷失在所有这些计算中,但我敢肯定,如果您想在单个查询中进行所有这些计算,性能将会受到影响。另一种减少计算重复的方法是使用 let 关键字(没有针对它的扩展方法,因此您必须使用“传统的”LINQ)。这“让”您分配一个可以在查询中重复使用的变量。但我怀疑它会比您的分组方法表现得更好。

from f in Fahrer
let meterFaktor = 100m / x.Sum(y =>.BasisMeter)
select new FahrerLigaEintrag()
{
...
}

关于c# - Linq to Entities 中是否有一种有效的中间计算方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8167058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com