4

我有一个 linq 查询,它将客户表中的所有记录提取到一个可观察的集合中,如下所示:

customerList = new ObservableCollection<customer>(dbContext.customers);
dgRecords1.ItemsSource = customerList;

该列表绑定到数据网格。客户表包含近百个字段。但是我在数据网格上只显示了几个字段。我的问题是

使用 linq 查询仅从数据库中提取选定字段是否会提高客户筛选速度?

我需要过滤并有时会从此列表中删除记录。

将少数字段选择到可观察集合中的最佳方法是哪一种,有人可以提供一些示例 linq 查询吗?

4

2 回答 2

9

优化速度的提示:

  • 减少列减少所需的带宽
  • 减少行,但引入分页,减少了更多的带宽(通常)
  • 关闭更改跟踪和身份管理(例如ObjectTrackingEnabled在 LINQ-to-SQL 中)将减少数据后处理的开销
  • 使用预编译查询有时可以帮助减少预处理开销

......但坦率地说,当我们遇到这个问题时,我们通过编写“dapper”来“一劳永逸地”解决它,并且走老路:

var list = connection.Query<CustomerViewModel>(
    "select {some specific cols} from Customers").ToList();

哪里CustomerViewModel是一个与 LINQ 等无关的简单 POCO 类型,它只具有所需的值,例如:

class CustomerViewModel {
   public int Id {get;set;}
   public string Name {get;set;}
   // ...
}

这消除了所有不必要的开销,是您只想显示数据时的理想选择;此外,参数化和物化层经过了非常优化(使用策略缓存,以获得最佳性能)。

于 2012-12-13T11:27:08.097 回答
4

如果您只选择所需的列而不是所有列,则性能会有所提高。您可以使用StopWatch实际计算差异。最好只从数据库中选择所需的列,而不是全部。

您可能会考虑的另一件事是使用Skipand实现分页Take。您可能会看到:LINQ TO SQL GridView (Enhanced Gridview)

于 2012-12-13T11:21:13.407 回答