linq中如何在join中指定多个条件

            using (DataContext db = new DataContext(ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString))
            {
                IQueryable<ClassInformation> result = from c in db.GetTable<TClass>()
                                                      join t in db.GetTable<TTeacher>()
                                                      on new { id = c.ID, id1 = c.ID } 
                                                      equals new { id = t.ClassID, id1 = id }
                                                      select new ClassInformation { ID = c.ID, ClassID = t.ClassID, Name = c.Name, TeacherName = t.Name, Address = t.Address, Phone = t.Phone, Email = t.Email };
                ClassInformation k = result.Single();
                ViewData["K"] = k;
                return View();


            }

 

上述方法是网上找的解决办法,这种写法各条件之间是And的关系,但我需要实现Or的效果,采用了多次Join, 最后在Where条件中处理的做法,如下代码:

 

            //RiskType, RiskCatogary, Corrector和CorrectTime在关联表,需要用linq做进一步查询
            query = from hazard in query
                    join co in _hazardCorrecterLogRepository.GetAll() on hazard.Id equals co.HazardId into hzJoined
                    from co in hzJoined.DefaultIfEmpty()
                    join rk in _riskRepository.GetAll() on hazard.RiskId equals rk.Id into hzzJoined
                    from rk in hzzJoined.DefaultIfEmpty()
                        //join usr in UserManager.Users on new { u1 = hazard.Checker.Value, u2 = hazard.Verifier.Value, u3 = hazard.Accepter.Value, u4 = co.Corrector } equals new { u1 = usr.Id, u2 = usr.Id, u3 = usr.Id, u4=usr.Id } into hpJoined
                        //from usr in hpJoined.DefaultIfEmpty()
                    join usr1 in UserManager.Users on hazard.Checker equals usr1.Id into huJoined1
                    from usr1 in huJoined1.DefaultIfEmpty()
                    join usr2 in UserManager.Users on hazard.Checker equals usr2.Id into huJoined2
                    from usr2 in huJoined2.DefaultIfEmpty()
                    join usr3 in UserManager.Users on hazard.Checker equals usr3.Id into huJoined3
                    from usr3 in huJoined3.DefaultIfEmpty()
                    join usr4 in UserManager.Users on hazard.Checker equals usr4.Id into huJoined4
                    from usr4 in huJoined4.DefaultIfEmpty()
                    where ((string.IsNullOrEmpty(input.OperatorFilter) || !string.IsNullOrEmpty(input.OperatorFilter) && (usr1.Name.Contains(input.OperatorFilter) || usr2.Name.Contains(input.OperatorFilter) || usr3.Name.Contains(input.OperatorFilter) || usr4.Name.Contains(input.OperatorFilter))) &&
                          (!input.BeginCorrectTime.HasValue || input.BeginCorrectTime.HasValue && (co.CorrectionTime >= input.BeginCorrectTime.Value || hazard.CheckTime >= input.BeginCorrectTime.Value || hazard.VerificationTime >= input.BeginCorrectTime.Value || hazard.AcceptanceTime >= input.BeginCorrectTime.Value)) &&
                          (!input.EndCorrectTime.HasValue || input.EndCorrectTime.HasValue && co.CorrectionTime < input.EndCorrectTime.Value || hazard.CheckTime >= input.EndCorrectTime.Value || hazard.VerificationTime < input.EndCorrectTime.Value || hazard.AcceptanceTime < input.EndCorrectTime.Value) &&
                          (!input.RiskTypeFilter.HasValue || input.RiskTypeFilter.HasValue && rk.RiskType == input.RiskTypeFilter.Value) &&
                          (!input.RiskCategoryFilter.HasValue || input.RiskCategoryFilter.HasValue && rk.RiskCategory == input.RiskCategoryFilter.Value))
                    select hazard;

 

posted @ 2019-11-20 19:02  【舍予】  阅读(1032)  评论(0)    收藏  举报