0

甚至不确定我是否正确地表达了这个问题,我有一个巨大的 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 的新数据库设计的导入。

4

1 回答 1

0

您可以将 合并AdEnroll到 FROM 子句中,然后按如下方式简化 WHERE。我的编辑是大写的。

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
  LEFT OUTER JOIN ADENROLL AE ON ENR.ADPROGRAMVERSIONID = AE.ADPROGRAMVERSIONID
where systa.category in ('E','A') 
and stu.sycampusid = 6
and 
( 
    enr.AdProgramVersionId is null 
    OR 
    AE.ADCATALOGYEARID IS NOT NULL
)
于 2013-08-15T15:57:55.497 回答