我正在使用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