16

目標は、匿名型を使用せずにLINQtoSQLを使用してSQLServerに発行するクエリを最小限にすることです。メソッドの戻りタイプはILi​​st<Child1>である必要があります。関係は次のとおりです。

            Parent
    Child1          Child2
Grandchild1

親>子1は1対多の関係です

Child1> Grandchild1は1対nの関係です(nはゼロから無限大です)

親>子2は1対nの関係です(nはゼロから無限大です)

親、子1、および孫1のデータを熱心にロードして、SQLServerへのクエリを1つ実行できます。

ロードオプションを使用したこのクエリは、兄弟データ(Child2)を除くすべてのデータを熱心にロードします。

DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);

dataContext.LoadOptions = loadOptions;

IQueryable<Child1> children = from child in dataContext.Child1
                                select child;

兄弟データもロードする必要があります。私が試したアプローチの1つは、クエリを2つのLINQ to SQLクエリに分割し、結果セットをマージすることです(きれいではありません)が、兄弟データにアクセスすると、とにかく遅延ロードされます。

兄弟ロードオプションを追加すると、Grandchild1およびChild2レコードごとにSQL Serverにクエリが発行されます(これはまさに私が避けようとしていることです)。

DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);
loadOptions.LoadWith<Parent>(o => o.Child2List);

dataContext.LoadOptions = loadOptions;

IQueryable<Child1> children = from child in dataContext.Child1
                                select child;


exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=1

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=2

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=3

exec sp_executesql N'SELECT * FROM [dbo].[Child2] AS [t0]
WHERE [t0].[ForeignKeyToParent] = @p0',N'@p0 int',@p0=4

また、データを積極的にロードすることを期待して、すべてのデータを結合するLINQ to SQLクエリを記述しましたが、Child2またはGrandchild1のLINQ to SQL EntitySetにアクセスすると、データが遅延ロードされます。

IList <Child1>を返す理由は、ビジネスオブジェクトをハイドレイトするためです。

私の考えは私がどちらかであるということです:

  1. この問題に間違った方法でアプローチします。
  2. ストアドプロシージャを呼び出すオプションはありますか?
  3. 私の組織はLINQtoSQLをORMとして使用すべきではありませんか?

どんな助けでも大歓迎です。

ありがとうございました、

-スコット

4

2 に答える 2

14

あなたが持っているものは正しいはずです、あなたdataContext.DeferredLoadingEnabled = false;はあなたがすでに設定しているLoadOptionsに加えてこれを追加する必要があります。

于 2010-03-30T15:17:19.330 に答える
0
var children2 = from child2 in dataContext.Child2
                where children.Any(c1 => c1.Parent == child2.Parent)
                select child2;

単一の存在クエリになるはずなので、2つのクエリになります。

于 2010-03-30T20:21:45.030 に答える