как установить дополнительное поле в запросе sql Server

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я хочу получить следующую модель от dapper:

  public class CourseShowViewModel
    {
        public long Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public string ImageId { get; set; }
        public string DemoLink { get; set; }
        public long TotalDuration { get; set; }
        public TimeSpan TotalDurationTimeSpan { get; set; }
        public CourseStatusEnum CourseStatusEnum { get; set; }
        public string CourseStatusString { get; set; }
        public double Price { get; set; }
        public string AgePeriod { get; set; }
        public bool CanView { get; set; }

        public List<CourseItemShowViewModel> CourseItemShowViewModels { get; set; }
    }

    public class CourseItemShowViewModel
    {
        public long Id { get; set; }
        public string Title { get; set; }
        public long Duration { get; set; }
        public TimeSpan DurationTimeSpan { get; set; }
        public DateTime CreatedDate { get; set; }
        public string FileId { get; set; }
    }
  

запрос sql является:

 select c.[Id]
      ,c.[Title]
      ,c.[Description]
      ,c.[CreatedDate]
      ,c.[ImageId]
      ,c.[CourseStatusEnum]
      ,c.[TotalDuration]
      ,c.[Price]
      ,c.[CategoryEnum]
      ,c.[AgePeriod]
      ,c.[DemoLink]
      , 0 as [CanView]

      ,cp.[Id]
      ,cp.[Title]
      ,cp.[CreatedDate]
      ,cp.[Duration]
      ,cp.[FileId]
from Course as c
left join CourseParts cp on cp.CourseId = c.Id
  
  

Проблема в том, как установить [CanView] . если пользователь купил курс, значение должно быть 1 , а остальное должно быть 0 .
также [FileId] выглядит как [CanView] , и разница в том, что если пользователь купил курс, значение должно быть File of the coursePart for download , а остальное должно быть null .

Order таблица содержит пользовательские заказы. проверить запрос, купленный пользователем:

 if exists (select Id from Order where UserId = @userId and CourseId = @courseId)
  

Ответ №1:

Я не уверен, насколько модель dapper имеет отношение к вашему вопросу. Кажется, в основном сосредоточено на том, как заполнить [CanView] и как скрыть FileId на основе условия.

Но, основываясь на вашем заданном запросе, ввести данные в два поля не так сложно.

 select c.[Id]
      ,c.[Title]
      ,c.[Description]
      ,c.[CreatedDate]
      ,c.[ImageId]
      ,c.[CourseStatusEnum]
      ,c.[TotalDuration]
      ,c.[Price]
      ,c.[CategoryEnum]
      ,c.[AgePeriod]
      ,c.[DemoLink]
      , 
CASE WHEN EXISTS (select Id from Order where UserId = @userId and CourseId = @courseId) 
THEN 1 
ELSE 0
END as [CanView]
      ,cp.[Id]
      ,cp.[Title]
      ,cp.[CreatedDate]
      ,cp.[Duration]
      ,
CASE WHEN EXISTS (select Id from Order where UserId = @userId and CourseId = @courseId) 
THEN cp.[FileId]
ELSE null
END as [FileId]
from Course as c
left join CourseParts cp on cp.CourseId = c.Id
  

Вы также можете сделать это, переписав запрос, используя объединения для исключения данных. Но учитывая, что у вас уже есть подзапрос и обычный select. Это также должно сработать.

Ссылка на инструкцию по обращению к W3schools