如何提高这个简单LINQ的性能?

时间:2010-08-18 07:10:26

标签: linq sql-server-2005 performance

我有两个表,一个父“Point”和一个子“PointValue”,由一个外键“PointID”连接,在SQL Server 2005中形成一对多的关系。

我有一个LINQ查询:

        var points = from p in ContextDB.Points
                     //join v in ContextDB.PointValues on p.PointID equals v.PointID
                     where p.InstanceID == instanceId
                     orderby p.PointInTime descending
                     select new
                     {
                         Point = p,
                         Values = p.PointValues.Take(16).ToList()
                     };

从注释掉的连接和“值”赋值可以看出,“Point”表与“PointValue”有关系(LINQ称为“Points”和“PointValues”)。

当迭代“var points”IQueryable(比如,将它绑定到GridView等)时,初始查询非常快,但是迭代“Values”属性非常慢。 SQL事件探查器向我显示,对于“点”中的每个值,IQueryable执行另一个查询。

如何将此作为一个查询?

有趣的是,当取消注释连接时,初始查询会变得非常慢。

2 个答案:

答案 0 :(得分:1)

我想你想使用DataLoadOptions.LoadWith方法,如下所述:
http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx

在您创建DataContext时,您将执行以下操作:

DataLoadOptions options = new DataLoadOptions();
ContextDB.LoadOptions = options;
options.LoadWith((Point p) => p.PointValues);

答案 1 :(得分:1)

您应该确保PointValues表在PointID列上有一个索引。

另见这个问题:Does Foreign Key improve query performance?