我正在使用LinqToSql來查詢一個小的,簡單的SQL Server CE數據庫。如何提高使用EntitySet屬性的LinqToSql查詢的性能?
我注意到任何涉及子屬性的操作都令人失望地慢。
例如,如果我有一個Order
表引用的Customer
表,LinqToSql將自動創建一個EntitySet<Order>
屬性。這是一個很好的方便,允許我執行Customer.Order.Where(o => o.ProductName = "Stopwatch")
之類的操作,但由於某些原因,SQL Server CE在嘗試執行此類操作時掛起來非常糟糕。我的一個疑問,其實並不複雜,需要3-4秒才能完成。
我可以得到速度達到可以接受的,甚至快,如果我只是抓住了兩個表單獨並將其轉換爲List<Customer>
和List<Order>
,然後用我自己的查詢手動加入的話,但這需要很多額外的代碼。 LinqToSql自動生成這些EntitySet<T>
屬性 - 我想要使用它們。
那麼,我該如何提高性能呢?例如,有沒有任何DataContext
選項可以幫助?
注意:我的數據庫初始狀態只有大約250K,我不認爲它會增長到超過1-2Mb。所以,這不像有很多記錄。
更新
下面是我在我的問題中使用的示例表定義:
create table Order
(
Id int identity(1, 1) primary key,
ProductName ntext null,
Quantity int null
)
create table Customer
(
Id int identity(1, 1) primary key,
OrderId int null references Order (Id)
)
傑夫,謝謝。看着實際的SQL查詢幫助我找出問題所在。原來,我在'select'子句中填充的對象中的一個屬性導致了糟糕的性能。當我評論它時,它對SQL查詢沒有任何影響!我不確定究竟是爲什麼,但我認爲這是因爲該屬性是一個'System.Windows.Media.Brush',它沒有SQL等價物。無論如何,如果我將邏輯設置爲單獨的foreach循環,處理查詢的時間從〜3500ms降至〜100ms。你有這個解釋嗎? – devuxer 2010-05-21 20:25:28
這很有趣。我想知道,當Linq to SQL嘗試匹配類型並找不到匹配項時,是否像每行都引發內部異常。很難說。如果你真的有興趣找出原因,你可以進入LinqToSQL方法的調試器符號。 http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx – 2010-05-21 21:26:54