linq声明很慢

时间:2014-02-24 21:04:03

标签: c# linq linq-to-sql

我有一个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行(它也只是立即枚举)。

另外要注意香港专业教育学院改变了可疑线路! ......任何(...)语句和它一样慢。

是否存在我无效的任何地方?

2 个答案:

答案 0 :(得分:0)

您是否尝试过更改:

where ndcat.All(x => x != cl.CategoryCountryCategoryTypeMapping.CategoryID)

为:

where !ndcat.Any(x => x == cl.CategoryCountryCategoryTypeMapping.CategoryID)

...

答案 1 :(得分:0)

我最后改变了一点,但长话短说,我在分组之后而不是之前进行了ndcat检查,这使得速度提高了很多。