甚至不确定我是否正确地表达了这个问题,我有一个巨大的 sql server 障碍,所以这可能是我没有看到的一件简单的事情。我有以下查询:
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 的新数据库设计的导入。