Как улучшить производительность этого простого LINQ? - PullRequest
0 голосов
/ 18 августа 2010

У меня есть две таблицы: одна родительская «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()
                     };

Как видно из закомментированного соединения и назначения «Значения», таблица «Точка» имеет отношение к «PointValue» (называемые «Точки» и «PointValues» по LINQ).

При переборе IQueryable «var points» (скажем, при привязке его к GridView и т. Д.) Начальный запрос выполняется очень быстро, однако перебор свойства «Значения» выполняется очень медленно. SQL Profiler показывает мне, что для каждого значения в «точках» IQueryable выполняется другой запрос.

Как мне сделать так, чтобы это был один запрос?

Интересно, что начальный запрос становится очень медленным, когда соединение не комментируется.

Ответы [ 2 ]

1 голос
/ 18 августа 2010

Необходимо убедиться, что таблица PointValues ​​имеет индекс для столбца PointID.

См. Также этот вопрос SO: Улучшает ли внешний запрос производительность запросов?

1 голос
/ 18 августа 2010

Я думаю, что вы хотите использовать метод 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...