如何提高使用EntitySet属性的LinqToSql查询的性能?

时间:2010-05-21 05:37:20

标签: linq performance linq-to-sql sql-server-ce

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

1 个答案:

答案 0 :(得分:2)

我之前没有使用过Linq to SQL的SQL Server CE,但是有了这么小的数据库,我的直觉告诉我,性能问题更多地与糟糕的查询优化有关而不是磁盘访问。

尝试从Linq到SQL对象获取SQL查询,以查看可能发生的情况。也许可以针对CE数据库手动运行这些查询,以查看它们的执行情况。

很有可能只需添加正确的索引就可以解决问题。

您也可以尝试使用LinqToSQL Profiler。 http://l2sprof.com/