簡體   English   中英

使用 LINQ 根據條件用 true 或 false 填充布爾值

[英]Using LINQ to fill a boolean with true or false based off of condition

我正在執行 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();

我在這里關心的主要 2 個表是JobRequestJobRequestParameters ...

JobRequest表有 13 條記錄(但並非所有作業都有參數)。

JobRequestParameters表只有 4 條記錄。 它們由PkJobRequestId加入。 JobRequestParameterspkJobParameterId當且僅當從JobRequestPkJobRequestID有參數..

我如何修改這個 linq 查詢以類似於我在下面寫的 SQL。 如果 pkJobParameterId 存在,我希望能夠用 true 填充 HasParams,如果不存在則用 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();

在您的原始代碼中,它可能會執行以下操作:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM