简体   繁体   English

使用 LINQ 根据条件用 true 或 false 填充布尔值

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

I am performing a linq query to grab some data from the DB.我正在执行 linq 查询以从数据库中获取一些数据。

Here is my 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();

The main 2 tables I am concerned with here are JobRequest and JobRequestParameters ...我在这里关心的主要 2 个表是JobRequestJobRequestParameters ...

JobRequest table has 13 records (but not all jobs have parameters). JobRequest表有 13 条记录(但并非所有作业都有参数)。

JobRequestParameters table only has 4 records. JobRequestParameters表只有 4 条记录。 They are joined on by PkJobRequestId .它们由PkJobRequestId加入。 JobRequestParameters has a pkJobParameterId IF and only IF the PkJobRequestID from the JobRequest table has parameters.. JobRequestParameterspkJobParameterId当且仅当从JobRequestPkJobRequestID有参数..

How can I modify this linq query to be similar to the SQL I have written below.我如何修改这个 linq 查询以类似于我在下面写的 SQL。 I would like to be able to fill HasParams with a true if the pkJobParameterId exists, and a 1 if not.如果 pkJobParameterId 存在,我希望能够用 true 填充 HasParams,如果不存在则用 1 填充。 Below is my SQL下面是我的 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 

edit: I have tried this but my syntax is way off.编辑:我试过这个,但我的语法很差。

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

It might work, in your original code, to do something like:在您的原始代码中,它可能会执行以下操作:

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

But usually when you try to represent LINQ queries as exact translations of their SQL, it ends up overcomplicated.但是通常当您尝试将 LINQ 查询表示为其 SQL 的精确翻译时,它最终会变得过于复杂。 LINQ is a lot more expressive, and can usually represent what you really want better than SQL can. LINQ 的表现力要强得多,而且通常比 SQL 能更好地表达您真正想要的东西。 I'd probably do something like this.我可能会做这样的事情。

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

If you have navigation properties set up on your object model, you can do even better:如果您在对象模型上设置了导航属性,则可以做得更好:

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