Я новичок здесь, так что будьте терпимы :)Linq запрос связан с некоторыми свойствами
У меня есть запрос, как эти ниже:
ThesisListViewModel reviewModel = new ThesisListViewModel
{
ThesisModel = from the in thesisNavigatorRepository.Thesis
join tp1 in thesisNavigatorRepository.ThesisType1 on the.ThesisType1Id equals tp1.ThesisType1Id
join tp2 in thesisNavigatorRepository.ThesisType2 on the.ThesisType2Id equals tp2.ThesisType2Id
select new ThesisModel
{
Thesis_ThesisId = the.ThesisId,
Thesis_Subject = the.Subject,
Thesis_ShortDescription = the.ShortDescription,
ThesisType1_Description = tp1.Description,
ThesisType2_Description = tp2.Description,
Thesis_URL = the.URL,
Thesis_ThesisLocalization = the.ThesisLocalization,
AuthorModel = from per in thesisNavigatorRepository.Person
join uod in thesisNavigatorRepository.UnitOfDepartment on per.UODId equals uod.UODId
join dep in thesisNavigatorRepository.Department on uod.DepartmentId equals dep.DepartmentId
join ptt in thesisNavigatorRepository.PersonToThesis on per.PersonId equals ptt.PersonId
join prr in thesisNavigatorRepository.PersonRole on ptt.PersonRoleId equals prr.PersonRoleId
where ptt.ThesisId == the.ThesisId && ptt.PersonRoleId == 1
select new AuthorModel
{
Person_FistName = per.FirstName,
Person_LastName = per.LastName,
UnitOfDepartment_ShortName = uod.ShortName,
UnitOfDepartment_LongName = uod.LongName,
Department_ShortName = dep.ShortName,
Department_LongName = dep.LongName,
},
StaffModel = from per in thesisNavigatorRepository.Person
join uod in thesisNavigatorRepository.UnitOfDepartment on per.UODId equals uod.UODId
join dep in thesisNavigatorRepository.Department on uod.DepartmentId equals dep.DepartmentId
join ptt in thesisNavigatorRepository.PersonToThesis on per.PersonId equals ptt.PersonId
join prr in thesisNavigatorRepository.PersonRole on ptt.PersonRoleId equals prr.PersonRoleId
where ptt.ThesisId == the.ThesisId && ptt.PersonRoleId != 1
select new StaffModel
{
Person_FistName = per.FirstName,
Person_LastName = per.LastName,
Person_Title = per.Title,
UnitOfDepartment_ShortName = uod.ShortName,
UnitOfDepartment_LongName = uod.LongName,
Department_ShortName = dep.ShortName,
Department_LongName = dep.LongName,
},
},
ThesisType1Model = thesisNavigatorRepository.ThesisType1,
ThesisType2Model = thesisNavigatorRepository.ThesisType2,
PersonModel = thesisNavigatorRepository.Person,
PersonRoleModel = thesisNavigatorRepository.PersonRole,
UnitOfDepartmentModel = thesisNavigatorRepository.UnitOfDepartment,
DepartmentModel = thesisNavigatorRepository.Department
};
return PartialView(reviewModel);
И я хотел бы сделать это зависит от некоторых свойств, которые я Переходим к методу действия.
условие, которое мне нужно, это ниже (простая версия):
if(property1 == null or property2 == null) -> query for ThesisModel without where clause
elseif(property1 == null) ThesisModel where tp2.Description like property2
elseif(property2 == null) ThesisModel where tp1.Description like property1
else ThesisModel where tp1.Description like property1 and tp2.Description like property2
я застрял. Я могу, конечно, делать разные запросы для каждого условия, но я надеюсь, что это самый простой способ.
Не могли бы вы помочь?
P.S. Мой английский плохой, так жаль, если я допустил некоторые ошибки.
EDIT:
Я попытался с вашими идеями, но я стил не могу использовать его в моем проекте. Я передаю данные в мой контроллер с точкой зрения использованием ниже свойств:
public string SearchByType1 { get; set; }
public string SearchByType2 { get; set; }
public string SearchByPerson { get; set; }
public string SearchByPersonRole { get; set; }
public string SearchByUOD { get; set; }
public string SearchByDepartment { get; set; }
Каждого свойство имеет отношение к другой таблице, как вы можете увидеть в моем контроллере. Использование PredicateBuilder выглядит просто, только когда мои условия связаны с одним свойством в одной таблице. В настоящее время для двух свойств у меня есть такие условия:
where
(
string.IsNullOrEmpty(model.SearchByType1)
&&
string.IsNullOrEmpty(model.SearchByType2)
)
||
(
string.IsNullOrEmpty(model.SearchByType1)
&&
SqlFunctions.StringConvert((double)tp2.ThesisType2Id).Trim().Equals(model.SearchByType2)
)
||
(
string.IsNullOrEmpty(model.SearchByType2)
&&
SqlFunctions.StringConvert((double)tp1.ThesisType1Id).Trim().Equals(model.SearchByType1)
)
||
(
SqlFunctions.StringConvert((double)tp1.ThesisType1Id).Trim().Equals(model.SearchByType1)
&&
SqlFunctions.StringConvert((double)tp2.ThesisType2Id).Trim().Equals(model.SearchByType2)
)
Это работает, но выглядит ужасно, и у меня нет никаких идей. Не могли бы вы рассказать о своих идеях и помочь?
Только для информации я использую SqlFunctions.StringConvert из-за параметров, исходящих из (они из выпадающего списка - id в виде строки).
Ваш 'другое заявление if' никогда не будет выполнено, так как это будет также верно для' if' заявление – jbriggs
никогда не возражаете вы зафиксировали его, прежде чем я закончил свой комментарий – jbriggs
Да, я скопировано логика в вопросе, а затем реализована первая ИЛИ, вероятно, должна быть И. – RagtimeWilly