0

質問を正しく表現したかどうかさえわかりませんが、私は巨大な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 として使用する新しいデータベース設計へのインポートとして使用しています。

4

1 に答える 1

0

を FROM 句に組み込み、AdEnroll次のように 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 に答える