動的linqで生成したクエリがあります。問題は、初期データセットを自己結合すると、他のすべてのフィルターが最新のテーブルにあることです。イニシャルにしておきたいです。どうやってやるの?次に例を示します。
var result = dataContext.Person;
var initialData = result;
....
var subQuery = initialData.Where(String.Format(predicateEntityIn, entityPropertyName), subSelection);
report = report.Join(subQuery, propertyName, propertyName, "inner");
...
次に、パラメーターの初期データをフィルター処理したい
report = report.Where(String.Format("{0} = {1}", "PersonId", paramValue));
内部結合がない場合、クエリは正しくフィルタリングされますが、内部結合を使用すると、最初のタイプの最新のクエリでフィルタリングが行われ、selectも最新のテーブルで行われます。生成されるクエリは次のようなものです。
SELECT DISTINCT [t2].[Field1], [t2].[PersonId], [t2].[Field2]
FROM [dbo].[PersonDetails] AS [t0]
INNER JOIN [dbo].[Person] AS [t1] ON [t1].[PersonId] = [t0].[PersonId]
INNER JOIN [dbo].[PersonDetails] AS [t2] ON [t0].[PersonId] = [t2].[PersonId]
WHERE ([t2].[YearOfBirth] = 2012)
しかし、私はそれがなりたいです:
SELECT DISTINCT [t0].[Field1], [t0].[PersonId], [t0].[Field2]
FROM [dbo].[PersonDetails] AS [t0]
INNER JOIN [dbo].[Person] AS [t1] ON [t1].[PersonId] = [t0].[PersonId]
INNER JOIN [dbo].[PersonDetails] AS [t2] ON [t0].[PersonId] = [t2].[PersonId]
WHERE ([t0].[YearOfBirth] = 2012)
問題はこの行にありました
report = report.Join(subQuery, propertyName, propertyName, "inner");
そのはず
report = report.Join(subQuery, propertyName, propertyName, "outer");