4

以下のように、customer テーブルから監視可能なコレクションにすべてのレコードをフェッチする linq クエリがあります。

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

リストはデータグリッドにバインドされています。customer テーブルには、ほぼ 100 のフィールドが含まれています。しかし、データグリッドにはいくつかのフィールドしか表示されません。私の質問は

linqクエリを使用してデータベースから選択したフィールドのみを取得すると、顧客画面の速度が向上するかどうか?

このリストからレコードをフィルタリングし、場合によっては削除する必要があります。

観測可能なコレクションにいくつかのフィールドを選択するための最良の方法はどれですか?誰かがいくつかのサンプル linq クエリを提供できますか?

4

2 に答える 2

9

速度を最適化するためのヒント:

  • 列を減らすと、必要な帯域幅が減少します
  • 行を減らしますが、ページングを導入すると、帯域幅が大幅に削減されます(通常)
  • 変更の追跡と ID 管理 (LINQ-to-SQL など) をオフにするとObjectTrackingEnabled、データの後処理のオーバーヘッドが削減されます。
  • 事前にコンパイルされたクエリを使用すると、前処理のオーバーヘッドを削減できる場合があります

...しかし、率直に言って、この問題が発生したとき、「dapper」と書いて昔ながらの方法で「一度だけ」解決しました。

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

whereCustomerViewModelは、LINQ などとは関係のない単純な POCO 型で、必要な値だけを持っています。次に例を示します。

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

これにより、不要なオーバーヘッドがすべて削減され、データを表示するだけの場合に理想的です。さらに、パラメータ化およびマテリアライゼーション レイヤーは非常に最適化されています (最適なパフォーマンスを得るために、ストラテジ キャッシングを使用)。

于 2012-12-13T11:27:08.097 に答える
4

すべての列ではなく必要な列のみを選択すると、パフォーマンスが向上します。StopWatch実際に差を計算するために使用できます。すべての列ではなく、必要な列のみをデータベースから選択することをお勧めします。

考慮すべきもう 1 つのことは、 and を使用してページネーションを実装することSkipですTake。表示されることがあります: LINQ TO SQL GridView (強化された Gridview)

于 2012-12-13T11:21:13.407 に答える