2012-01-11 2 views
-1

시스템 관리자에게 검색 페이지를 구현하려고했습니다. 짧게 긴 이야기, criterias로 3 paramater. 1. 사용자, 2. 프로젝트, 3. 고객. 관리자는 이러한 세 가지 기준을 조합하여 만들 수 있습니다. 예를 들어 "이 프로젝트와 모든 고객에게 할당 된 모든 사용자를보고 싶습니다."또는 "이 고객 및이 프로젝트를 보려하지만 모든 사용자를보고 싶습니다." 그런 필터링을 어떻게 구현합니까? 나는 asp.net 4.0과 linq를 사용하고있다.관리자에 대한 필터링 검색 구현 방법

여기에 함수 내용이 모두 있습니다. 나는 조건에 의해 그것을 만들었지 만 전혀 건강하지 않습니다.

public static List<Data.CurrentActivity> GetUsersActivitySearch(string employeeId, string projectId, string customerId, DateTime startDate, DateTime endDate) 
     { 
      DataClassesDataContext dc = new DataClassesDataContext(General.ConnectionString); 

      if(projectId=="" && customerId!="") 
       return dc.CurrentActivities.Where(t => t.User.RecId.ToString() == employeeId && t.Customer.RecId.ToString() == customerId && t.ActivityDate >= startDate && t.ActivityDate <= endDate).ToList(); 
      else if (projectId != "" && customerId == "") 
       return dc.CurrentActivities.Where(t => t.User.RecId.ToString() == employeeId && t.Project.RecId.ToString() == projectId && t.ActivityDate >= startDate && t.ActivityDate <= endDate).ToList(); 
      else if (projectId != "" && customerId != "") 
       return dc.CurrentActivities.Where(t=>t.User.RecId.ToString()==employeeId && t.Customer.RecId.ToString()==customerId && t.Project.RecId.ToString()==projectId && t.ActivityDate>=startDate && t.ActivityDate<=endDate).ToList(); 
      return dc.CurrentActivities.Where(t => t.User.RecId.ToString() == employeeId && t.ActivityDate >= startDate && t.ActivityDate <= endDate).ToList(); 
     } 
+0

적어도 시도해보아야 만 코드가 게시 될 수 있습니다. 다른 사람들이 완전한 솔루션을 찾지 않을 것으로 기대하지 마십시오. – Glenn

답변

0

이제 코드를 보았으므로 쉬운 해결책이 있습니다. 당신은 실제로 때문에 게으른 실행의 된 IQueryable 인터페이스에 where 절을 복잡하게 할 수 있습니다

 DataClassesDataContext dc = new DataClassesDataContext(General.ConnectionString); 
     var result = dc.CurrentActivies.Where(t.ActivityDate >= startDate && t.ActivityDate <= endDate); 

     if(userId.Length > 0) 
      result = result.Where(t => t.User.RecId.ToString() == employeeId); 

     if (projectId.Length > 0) 
      result = result.Where(t => t.Project.RecId.ToString() == projectId); 

     if (customerId.Length > 0) 
      result = result.Where(t=>t.Customer.RecId.ToString()==customerId); 

     return result.ToList(); 

당신이 당신의 결과를 표시 할 수있는 충분한 정보를 나타낼 수 일반화 된 객체가 있다면. 그러면 다음과 같이 할 수 있습니다.

public IList<SearchResults> Search(string user, string customer, string project) 
{ 
    return (from user in context.Users 
     where SqlMethods.Like(user.Name, user) && user.Length > 0 
     select new SearchResult 
     { 
      ... properties you care about 
     }) 
     .Concat(from project in context.Projects 
      where SqlMethods.Like(project, project.Name) && project.Length > 0 
      select new SearchResult 
      { 
       /// 
      }) 
     .Concat(from customer in context.Customers 
      where SqlMethods.Like(customer, customer.Name) && customer.Length > 0 
      select new SearchResult 
      { 
       /// 
      }) 
     .ToList(); 
} 
+0

이 오류가 발생했습니다. '표 (고객) .Where (고객 => Like (customer.RecId.ToString(), Invoke (value (System.Func'1 [System.String]))))) 표현식을 변환 할 수 없습니다. 선택 (고객 => Invoke (value (System.Func'1 [Data.CurrentActivity]))) '을 SQL에 저장하고 로컬 표현식으로 처리 할 수 ​​없습니다. – Ktt

+0

하지만 user.name 테이블의 기본 키를 검색하려고했습니다. 나는 user.recId 대신에 – Ktt

+0

을 사용했는데, 그 이름을 사용하여 작업을하지 못했습니다. – Ktt