2010-08-18 2 views
0

У меня есть две таблицы, одна родительская «точка» и один дочерний «PointValue», соединенный одним внешним ключом «PointID», создающий отношение «один ко многим» в SQL Server 2005.Как повысить производительность этого простого LINQ?

У меня есть 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).

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

Как получить этот запрос?

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

ответ

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); 
+0

Спасибо. В конечном счете, поскольку вторую таблицу можно вытащить, используя только FK, я сделал это как отдельный запрос и преобразовал его в список, а затем выполнил запросы на итерацию в списке в памяти. Это оказалось очень быстрым. –

Смежные вопросы