0

こんにちは、次の質問があります。データベース内の2つのテーブルがどこにあると仮定します。

Clients(
  id,
  name,
  address)

Orders(
  id,
  name,
  desc,
  datemodified,
  client_id)

2番目のものは最初のものを参照します。つまり、各注文はクライアントに割り当てられます。ここで、 LinqDataSource for Ordersテーブルを含む.aspxページと、このデータソースを使用して次の列を持つテーブルを表示するGridViewがあるとします。

  1. 注文名。
  2. 注文説明
  3. クライアント名。
  4. クライアントアドレス。

私が理解している限り、Linq to SQLは、デフォルトでは関連するエンティティをロードせず、子プロパティが要求された場合にのみロードするように設計されています。したがって、ページが読み込まれると、次の状況が発生します。

  1. 最初のクエリは、Ordersテーブルからレコードを取得します。
  2. GridViewによって表示される行ごとに、クライアントプロパティの1つが要求されたときに、追加のクエリが実行されます。

したがって、100の注文がある場合、これは1つではなく101のクエリを実行することを意味します(または、クエリが各クライアントプロパティに対して実行される場合は、201のクエリを実行することもあります)。これを回避し、LinqDataSourceに単一のクエリですべての必須フィールドをロードさせる方法は?

現在、この問題の唯一の回避策があります。結合クエリでSqlDataSourceを使用すると、必要なすべてのフィールドが一度に取得されます。

4

2 に答える 2

0

LinqDataSourceのOnSelectingイベントをオーバーライドして、探している正確なデータで匿名タイプを取得することができます。

protected void LinqDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
    DataContext dc = new DataContext();
    var query = from o in dc.Orders
                select new
                {
                    OrderName = o.name,
                    OrderDesc = o.desc,
                    ClientName = o.Client.name,
                    ClientAddress = o.Client.address
                };
    // Insert any necessary conditional statements adjustments as needed.

    e.Result = query;
}

データベースに送信するクエリは、これら4つのフィールドのみを取得し、内部結合を使用して実行するため、行ごとに1回だけデータを取得します。

于 2011-03-04T18:47:01.760 に答える
0

LinqDataSource.ContextCreatedイベントでLoadOptionsを設定します

それを行う方法をここで見て くださいhttp://codebetter.com/davidhayden/2007/08/06/linq-to-sql-query-tuning-for-performance-optimization/

于 2011-03-06T16:40:00.010 に答える