Как реализовать фильтрацию поиска администратора - PullRequest
0 голосов
/ 11 января 2012

Я пытался создать страницу поиска для администратора моей системы. Короче говоря, есть 3 параметра как критерии. 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();
        }

1 Ответ

0 голосов
/ 11 января 2012

Теперь, когда я вижу ваш код, у меня есть простое решение. Вы можете составить предложение where в интерфейсе IQueryable из-за отложенного выполнения:

        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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...