我完全不熟悉LINQ。我有一个SQL GroupBy
,它几乎运行几毫秒。但是当我尝试通过LINQ实现同样的事情时,它似乎非常缓慢。 我试图实现的是获取平均每月持续时间的角蛋白数据库更新。LINQ Multiple GroupBy Query比T-SQL慢几倍
在SQL =>
select SUBSTRING(yyyyMMdd, 0,7),
AVG (duration)
from (select (CONVERT(CHAR(8), mmud.logDateTime, 112)) as yyyyMMdd,
DateDIFF(ms, min(mmud.logDateTime), max(mmud.logDateTime)) as duration
from mydb.mydbo.updateData mmud
left
join mydb.mydbo.updateDataKeyValue mmudkv
on mmud.updateDataid = mmudkv.updateDataId
left
join mydb.mydbo.updateDataDetailKey mmuddk
on mmudkv.updateDataDetailKeyid = mmuddk.Id
where dbname = 'MY_NEW_DB'
and mmudkv.value in ('start', 'finish')
group
by (CONVERT(CHAR(8), mmud.logDateTime, 112))
) as resultSet
group
by substring(yyyyMMdd, 0,7)
order
by substring(yyyyMMdd, 0,7)
在LINQ =>我第一次提取的表中的链接数据库名称和的UpdateData的信息的记录,然后做过滤和GROUPBY上的相关信息。
entry.updatedata.Where(
ue => ue.updatedataKeyValue.Any(
uedkv =>
uedkv.Value.ToLower() == "starting update" ||
uedkv.Value.ToLower() == "client release"))
.Select(
ue =>
new
{
logDateTimeyyyyMMdd = ue.logDateTime.Date,
logDateTime = ue.logDateTime
})
.GroupBy(
updateDataDetail => updateDataDetail.logDateTimeyyyyMMdd)
.Select(
groupedupdatedata => new
{
UpdateDateyyyyMM = groupedupdatedata.Key.ToString("yyyyMMdd"),
Duration =
(groupedupdatedata.Max(groupMember => groupMember.logDateTime) -
groupedupdatedata.Min(groupMember => groupMember.logDateTime)
)
.TotalMilliseconds
}
).
ToList();
var updatedataMonthlyDurations =
updatedataInDateRangeWithDescriptions.GroupBy(ue => ue.UpdateDateyyyyMM.Substring(0,6))
.Select(
group =>
new updatedataMonthlyAverageDuration
{
DbName = entry.DbName,
UpdateDateyyyyMM = group.Key.Substring(0,6),
Duration =
group.Average(
gmember =>
(gmember.Duration))
}
).ToList();
我知道LINQ中的GroupBy和T-SQL中的GroupBy不一样,但不知道幕后会发生什么。任何人都可以解释这种差异,当我运行LINQ版本时会发生什么?在第一个GroupBy之后,我做了.ToList()之后,事情变得更快了。但即使如此,找到平均持续时间的方式确实很慢。 什么是最好的选择,并且有没有使用Visual Studio 2012改进慢速LINQ语句的方法?
您应该检查生成的SQL的外观。 – MarcinJuraszek
谢谢@MarcinJuraszek。我检查了它,这完全不是我所期望的。感谢LINQPad。 –