TFS 2010 API - 迭代QueryHistory中返回的更改集列表太慢了

时间:2011-03-01 12:21:14

标签: c# .net tfs2010 changeset tfs-sdk

长话短说。分析后,此命令占用处理的0.1%

var ChangesetList = TFSConnection.GetInstance().GetVersionControl().QueryHistory
    (Path, VersionSpec.Latest,0, RecursionType.Full, "", null, 
    VersionSpec.Latest, Int32.MaxValue,true, false);

这一个,65.7%。 (有趣的是,内部的所有处理只消耗3%)

foreach (Changeset changeset in ChangesetList)

我得到我的清单需要几秒钟...... 怎么了?为什么在列表中迭代这么慢?

有没有更快的方法呢?

编辑:另外,为什么我不能直接将其转换为List<Changeset>

3 个答案:

答案 0 :(得分:10)

VersionControlServer.QueryHistory的调用返回一个IEnumerable,所以我假设它就像在LINQ to Objects中一样,一旦迭代IEnumerable(关键字:延迟执行),就会执行实际的查询。 / p>

您无法将结果分配给List,因为返回值是IEnumerable的非通用版本。在结果上调用Cast<Changeset>()OfType<Changeset>()会返回通用IEnumerable<Changeset>.之后,您可以致电ToList()并获取List<Changeset>ToList()遍历IEnumerable<T>,因此就像foreach一样,占用了大部分时间。

我提到的方法是扩展方法,位于System.Linq命名空间中。

答案 1 :(得分:4)

QueryHistory延迟加载集合。也就是说,在您尝试迭代它之前,它实际上并不执行您的查询。

答案 2 :(得分:1)

布尔“包含更改”花费时间...如果您不包含更改而只包含更改集的元数据,则查询速度非常快

所以查询应如下所示:

var ChangesetList = TFSConnection.GetInstance().GetVersionControl().QueryHistory     (Path, VersionSpec.Latest,0, RecursionType.Full, "", null, VersionSpec.Latest, Int32.MaxValue,**false,** false);