2015-02-26 2 views
0

Я новичок здесь, так что будьте терпимы :)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 в виде строки).

ответ

0

Объявите каждое условие как Func, а затем передайте его запросу. Что-то вдоль линий:

Func<string, bool> predicate; 

if (prop1 == null && prop2 == null) 
    predicate = (s1, s2) => true; 
else if (prop1 == null) 
    predicate = (s1, s2) => prop2 == s2; 
else if (prop2 == null) 
    predicate = (s1, s2) => prop1 == s1; 
else 
    predicate = (s1, s2) => prop1 == s1 && prop2 == s2; 

var model = thesisNavigatorRepository.Thesis.Where(t => predicate(t.Description1, t.Description2)); 
+0

Ваш 'другое заявление if' никогда не будет выполнено, так как это будет также верно для' if' заявление – jbriggs

+0

никогда не возражаете вы зафиксировали его, прежде чем я закончил свой комментарий – jbriggs

+0

Да, я скопировано логика в вопросе, а затем реализована первая ИЛИ, вероятно, должна быть И. – RagtimeWilly

Смежные вопросы