Использование LINQ, чтобы заполнить логическое значение true или false, исходя из условия - PullRequest
0 голосов
/ 14 февраля 2020

Я выполняю запрос linq для получения некоторых данных из БД.

Вот мой linq:

   var requests = (from job in db.JobRequest
                        join jobCode in db.Job on job.JobCode equals jobCode.PkJobCode
                        join jobParams in db.JobRequestParameter on job.PkJobRequestId equals jobParams.FkJobRequestId into jobRequestParameters
                        from jobParams in jobRequestParameters.DefaultIfEmpty()
                        select new Objects.JobRequest.JobRequest()
                        {
                            JobRequestId = job.PkJobRequestId,
                            JobType = job.FkJobType,
                            JobCode = job.JobCode,
                            Schedule = job.Schedule.AddMilliseconds(-job.Schedule.Millisecond),
                            IsRunning = job.Running,
                            Description = jobCode.BriefDescription,
                            HasParams = ???
                        }).ToList();

Основные две таблицы, которые меня интересуют, это JobRequest и JobRequestParameters ...

JobRequest таблица содержит 13 записей (но не все задания имеют параметры).

JobRequestParameters таблица содержит только 4 записи. К ним присоединяется PkJobRequestId . JobRequestParameters имеет pkJobParameterId IF и только ЕСЛИ * PkJobRequestID из JobRequest таблицы имеет параметры ..

Как можно Я модифицирую этот запрос linq, чтобы он был похож на SQL, который я написал ниже. Я хотел бы иметь возможность заполнить HasParams со значением true, если pkJobParameterId существует, и 1, если нет. Ниже мое SQL

        SELECT 
      job.pkJobRequestId,
      jobParams.pkJobParameterId,
      (CASE
        WHEN jobParams.pkJobParameterId IS NULL THEN 1 
        ELSE 0
      END) AS HasParams
    FROM
      Job.JobRequest job INNER JOIN
      Reference.Job jobCode ON job.JobCode = jobCode.pkJobCode LEFT OUTER JOIN 
      job.JobRequestParameter jobParams ON job.pkJobRequestId = jobParams.fkJobRequestId 

редактирование: я пробовал это, но мой синтаксис далеко.

requests = (from job in db.JobRequest
                        join jobCode in db.Job on job.JobCode equals jobCode.PkJobCode
                        join jobParams in db.JobRequestParameter on job.PkJobRequestId equals jobParams.FkJobRequestId into jobRequestParameters
                        from jobParams in jobRequestParameters.DefaultIfEmpty() 
                        select new { pkJobRequestId = job, pkJobParameterId = jobParams == null ? false : true} as blahblah 
                        select new Objects.JobRequest.JobRequest()
                        {
                            JobRequestId = job.PkJobRequestId,
                            JobType = job.FkJobType,
                            JobCode = job.JobCode,
                            Schedule = job.Schedule.AddMilliseconds(-job.Schedule.Millisecond),
                            IsRunning = job.Running,
                            Description = jobCode.BriefDescription,
                            HasParameters = blahblah.PkJobParameterId == null ? true : false
                        }).ToList();

1 Ответ

1 голос
/ 14 февраля 2020

В вашем исходном коде может работать что-то вроде:

HasParams = ((object)jobParams.FkJobRequestId) == null

Но обычно, когда вы пытаетесь представить запросы LINQ как точные переводы их SQL, это приводит к чрезмерному усложнению. LINQ намного более выразителен и обычно может представлять то, что вы действительно хотите, лучше, чем SQL. Я бы, наверное, сделал что-то вроде этого.

var requests = (from job in db.JobRequest
                    join jobCode in db.Job on job.JobCode equals jobCode.PkJobCode
                    select new Objects.JobRequest.JobRequest()
                    {
                        JobRequestId = job.PkJobRequestId,
                        JobType = job.FkJobType,
                        JobCode = job.JobCode,
                        Schedule = job.Schedule.AddMilliseconds(-job.Schedule.Millisecond),
                        IsRunning = job.Running,
                        Description = jobCode.BriefDescription,
                        HasParams = db.JobRequestParameter.Any(jobParams => job.PkJobRequestId == jobParams.FkJobRequestId)
                    }).ToList();

Если у вас настроены свойства навигации на вашей объектной модели, вы можете сделать еще лучше:

var requests = (from job in db.JobRequest
                let jobCode = job.JobCodeEntity // or whatever your nav property is called
                select new Objects.JobRequest.JobRequest()
                    {
                        JobRequestId = job.PkJobRequestId,
                        JobType = job.FkJobType,
                        JobCode = job.JobCode,
                        Schedule = job.Schedule.AddMilliseconds(-job.Schedule.Millisecond),
                        IsRunning = job.Running,
                        Description = jobCode.BriefDescription,
                        HasParams = job.JobParams.Any()
                    }).ToList();
...