我有一个linq to sql数据上下文设置。我试着期望一个由mappingID标识的日志量,所以我用它来编写一个webclient,它显示了这些下载的状态。现在我的情况是linq语句永远占用,尽管行数似乎相对较低。
永远的声明是:
var dlCatToUnion = (from cl in currentLogs
where ndcat.All(x=>x!=cl.CategoryCountryCategoryTypeMapping.CategoryID)
group cl by cl.CategoryCountryCategoryTypeMapping.Category.CategoryID into t1
select new CategoryStruct
{
CategoryName = t1.Max(x => x.CategoryCountryCategoryTypeMapping.Category.Name),
Status = t1.Any(x=>x.Response!=(int)ErrorCodes.staticCodes.success)
? (int)ErrorCodes.staticCodes.genericFailure : (int)ErrorCodes.staticCodes.success,
AverageResponseTime = 0,
categoryId = t1.Key
}
);
具体来说,如果你看一下where ndcat.All(x=>x!=cl.CategoryCountryCategoryTypeMapping.CategoryID)
的第二行,如果我把这部分拿出去,那就是它的瞬间。
要了解该行正在做什么:
var ndcat = (from ndid in notDownloadedIds
where ndid.Category.StorefrontID==StorefrontID
group ndid by ndid.CategoryID into finalCat
select finalCat.Key);
然后是notDownloadedIds
notDownloadedIds = cDataContext.CategoryCountryCategoryTypeMappings.Where(mapping =>!
currentLogs.Select(dll => dll.CategoryCountryCategoryTypeMappingID).Any(id => id == mapping.CategoryCountryCategoryTypeMappingID));
为了给出行计数的一些估计,currentLogs大约是25k行,CategoryCountryCategoryTYpeMappingID大约是53k行。 ndcat最终成为47行(它也只是立即枚举)。
另外要注意香港专业教育学院改变了可疑线路! ......任何(...)语句和它一样慢。
是否存在我无效的任何地方?
答案 0 :(得分:0)
您是否尝试过更改:
where ndcat.All(x => x != cl.CategoryCountryCategoryTypeMapping.CategoryID)
为:
where !ndcat.Any(x => x == cl.CategoryCountryCategoryTypeMapping.CategoryID)
...
答案 1 :(得分:0)
我最后改变了一点,但长话短说,我在分组之后而不是之前进行了ndcat检查,这使得速度提高了很多。