目標は、匿名型を使用せずにLINQtoSQLを使用してSQLServerに発行するクエリを最小限にすることです。メソッドの戻りタイプはIList<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>を返す理由は、ビジネスオブジェクトをハイドレイトするためです。
私の考えは私がどちらかであるということです:
- この問題に間違った方法でアプローチします。
- ストアドプロシージャを呼び出すオプションはありますか?
- 私の組織はLINQtoSQLをORMとして使用すべきではありませんか?
どんな助けでも大歓迎です。
ありがとうございました、
-スコット