나는 내 시스템에서 작업을하고 검색을 위해 특별 클래스를 생성 :
public IQueryable<Task> Filter(IQueryable<Task> tasks)
{
return
FilterDates(
FilterAssignedTo(
FilterGroups(
FilterOperationSystems(
FilterPlatforms(
FilterPriorities(
FilterSeverities(
FilterVersionsResolved(
FilterVersionsReported(
FilterTaskContent(
FilterStatuses(tasks)))))))))));
}
이 필터링에 사용되는 방법 중 하나입니다 :
해당 클래스에서
public class TaskSearchCriteria
{
public List<int> Statuses { get; set; }
public List<int> Severities { get; set; }
public List<int> CreatedBy { get; set; }
public List<int> ClosedBy { get; set; }
public List<int> LastModificationBy { get; set; }
public DateTime? CreationDateFrom { get; set; }
public DateTime? CreationDateTo { get; set; }
public bool SearchInComments { get; set; }
public bool SearchInContent { get; set; }
public bool SearchInTitle { get; set; }
}
한 가지 방법은 필터를 적용
private IQueryable<Task> FilterSeverities(IQueryable<Task> tasks)
{
if (Severities.Contains(TaskSearchConsts.All) || (!Severities.Any()))
return tasks;
var expressions = new List<Expression>();
if (Severities.Contains(TaskSearchConsts.Active))
expressions.Add(_taskParameter.EqualExpression("Severity.IsActive", 1));
return tasks.WhereIn(_taskParameter, "Severity.ID", Severities, expressions);
}
이것은 엔티티 프레임 워크이지만 nHibernate에서도 쉽게 위치를 추가 할 수 있습니다. IQuery에 대한 절.
내가 컨트롤러 방법을 검색하려면 :
[HttpPost]
public ActionResult TaskSearch([Bind(Prefix = "Search")]TaskSearchCriteria criteria)
필터링을위한 하나 개의 클래스를 갖는 것은 좋은, 그것은 직렬화하고 향후 사용을 위해 데이터베이스에 저장할 수 있기 때문이다. 이렇게하면 필터 매개 변수를 다시 사용할 수 있습니다.
당신은 것이다 : 목록이 비어 있으면
이
public class CarSearchCriteria
{
List<int> ListOfCarTypesIds;
List<int> ListOfCarBrandIds;
bool IsNew;
//and more
}
, 당신이 필터를 적용하지 않습니다.