質問を正しく表現したかどうかさえわかりませんが、私は巨大なSQLサーバーのハンディキャップを持っているので、これは私が見ていない単純なことかもしれません. 次のクエリがあります。
select
stu.SyStudentId,
stu.FirstName,
stu.LastName,
stu.StartDate,
enr.AdProgramVersionId,
enr.AdCatalogYearId,
enr.GPA as CumGPA,
case when (stu.DateLstMod > enr.DateLstMod)
then stu.DateLstMod
else enr.DateLstMod
end as DateLstMod
from
SyStudent stu
inner join adenroll enr on enr.systudentid = stu.systudentid
inner join syschoolstatus schsta on schsta.syschoolstatusid = enr.syschoolstatusid
inner join SyStatus systa on systa.SyStatusId = schsta.SyStatusId
where systa.category in ('E','A')
and stu.sycampusid = 6
and
(
enr.AdProgramVersionId is null
or
(enr.AdProgramVersionId = '52' and enr.AdCatalogYearId='3')
or
(enr.AdProgramVersionId='53' and enr.AdCatalogYearId='3')
or
(enr.AdProgramVersionId='50' and enr.AdCatalogYearId='3')
or
(enr.AdProgramVersionId='51' and enr.AdCatalogYearId='3')
or
(enr.AdProgramVersionId='52' and enr.AdCatalogYearId='4')
or
(enr.AdProgramVersionId='53' and enr.AdCatalogYearId='4')
or
(enr.AdProgramVersionId='50' and enr.AdCatalogYearId='4')
or
(enr.AdProgramVersionId='51' and enr.AdCatalogYearId='4')
or
(enr.AdProgramVersionId='54' and enr.AdCatalogYearId='4')
)
ネストされた「and」句の値はすべて、データベース自体から取得できます。値の条件は基本的に次のとおりです。
Select adProgramVersionID
from AdEnroll
where AdCatalogYearId is not null
しかし、 or 句のリストではなくそれを入れようとすると、別の結果セットが得られます。私がする必要があることを達成する方法はありますか (ハードコードされた番号をテーブルからのその番号の取得に置き換えます)? サブクエリ?奇妙な結合?黒魔術?
これは、単純な SQL クエリに置き換えようとしているコードです。
var query = @"
select
stu.SyStudentId,
stu.FirstName,
stu.LastName,
stu.StartDate,
enr.AdProgramVersionId,
enr.AdCatalogYearId,
enr.GPA as CumGPA,
case when (stu.DateLstMod > enr.DateLstMod)
then stu.DateLstMod
else enr.DateLstMod
end as DateLstMod
from
SyStudent stu
inner join adenroll enr on enr.systudentid = stu.systudentid
inner join syschoolstatus schsta on schsta.syschoolstatusid = enr.syschoolstatusid
inner join SyStatus systa on systa.SyStatusId = schsta.SyStatusId
where systa.category in ('E','A')
and stu.sycampusid = 6
and
(
enr.AdProgramVersionId in
("
+ String.Join(",", dc.CatalogPrograms.Where(cp => cp.Catalog.CvAdCatalogYearId == null).Select(cp => cp.CvAdProgramVersionId)) + @"
)
or
(";
// get the students in program versions that use catalogs
var andClauses = new List<string>();
foreach (var catProg in dc.CatalogPrograms.Where(cp => cp.Catalog.CvAdCatalogYearId != null))
andClauses.Add("(enr.AdProgramVersionId=" + catProg.CvAdProgramVersionId + " and enr.AdCatalogYearId=" + catProg.Catalog.CvAdCatalogYearId + ")");
query += string.Join("\n or", andClauses) + @"
)
)";
このコードを削除したい理由は、新しいソリューションに linq-to-sql を混ぜたくないからです。これを、EF を ORM として使用する新しいデータベース設計へのインポートとして使用しています。