我正在使用LinqToSql查询一个简单的小型SQL Server CE数据库。
我注意到涉及子属性的任何操作都令人失望地缓慢。
例如,如果我有Customer
表引用的Order
表,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)
)
答案 0 :(得分:2)
我之前没有使用过Linq to SQL的SQL Server CE,但是有了这么小的数据库,我的直觉告诉我,性能问题更多地与糟糕的查询优化有关而不是磁盘访问。
尝试从Linq到SQL对象获取SQL查询,以查看可能发生的情况。也许可以针对CE数据库手动运行这些查询,以查看它们的执行情况。
很有可能只需添加正确的索引就可以解决问题。
您也可以尝试使用LinqToSQL Profiler。 http://l2sprof.com/