2010-08-18 27 views
0

我有兩個表,一個父「Point」和一個孩子「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等時),初始查詢非常快,但是通過「Values」屬性迭代非常緩慢。 SQL Profiler告訴我,對於「points」中的每個值,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將第二個表拉出來,我將它作爲單獨的查詢並將其轉換爲List,然後在內存列表中執行每次迭代查詢。結果非常快。 – 2010-08-18 08:12:28