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;

浙公网安备 33010602011771号