2017-01-31 4 views
0

Есть ли способ фильтрации данных с использованием свойства enum с помощью строки?Как фильтровать по перечислению из строки в LINQ C#

Это моя функция в слое услуг, которая принимает 2 аргумента для функции пейджинга, а третий аргумент - для фильтрации проектов по их статусу.

Я хочу сделать что-то вроде этого projects.Where(x => x.Status == status), но он вызывает ошибку, потому что я не могу сравнивать перечисление со строкой. Есть ли какое-то обходное решение для этого?

public async Task<ListResult<ProjectDTO>> GetListedProjects(int pageSize, int pageNumber, string status) 
{ 
    var projects = await unitOfWork.ProjectRepository.Get(); 
    //i cannot filter like this 
    projects.Where(x => x.Status == status); 
    var orderedProjects = projects.OrderBy(x => x.Name); 

    var projectList = orderedProjects.ToPagedList(pageNumber, pageSize); 

    var data = projectList.Select(x => ToDTO.ProjectBuild(x)).ToList(); 
    return new ListResult<ProjectDTO> { Data = data, TotalCount = projectList.TotalItemCount }; 
} 

Вот мой проект модели:

public class Project : ManagementBaseClass 
{ 
    [Key] 
    public int Id { get; set; } 
    public Status Status { get; set; } 
    public Priority Priority { get; set; } 
    //etc just deleted more properties to make this cleaner 
} 

Это мое перечисление, которое я использую для присвоения статуса проектов, задач и т.д.

public enum Status 
{ 
    New = 1, 
    Active = 2, 
    OnHold = 3, 
    Testing = 4, 
    Finished = 5, 
    Dropped = 6 
} 
+3

Do Вы должны использовать в качестве Parametr методы как 'строки status'? Почему бы вам не использовать статус статуса? – Tatranskymedved

+0

@Tatranskymedved да это кажется невероятно очевидным. – jdmdevdotnet

+1

Возможный дубликат [как сравнить строку с перечислением в C#] (http://stackoverflow.com/questions/11508865/how-to-compare-string-with-enum-in-c-sharp) – Win

ответ

1

Вы можете разобрать строку в перечислении эквивалент

Очевидно, что этот код является приблизительным, чтобы дать вам представление и установить вас на правильном пути, вам нужно будет выполнить нулевые проверки в Parse для предотвращения исключений или использовать TryParse.

public async Task<ListResult<ProjectDTO>> GetListedProjects(int pageSize, int pageNumber, string status) 
{ 
    var projects = await unitOfWork.ProjectRepository.Get(); 
    //i cannot filter like this 
    projects.Where(x => x.Status == (Status)Enum.Parse(typeof(Status), status)); 
    var orderedProjects = projects.OrderBy(x => x.Name); 

    var projectList = orderedProjects.ToPagedList(pageNumber, pageSize); 

    var data = projectList.Select(x => ToDTO.ProjectBuild(x)).ToList(); 
    return new ListResult<ProjectDTO> { Data = data, TotalCount = projectList.TotalItemCount }; 
} 
1

Вы проходя string как таковой:

public async Task<ListResult<ProjectDTO>> GetListedProjects(int pageSize, int pageNumber, string status) 
{ 
    var projects = await unitOfWork.ProjectRepository.Get(); 
    //i cannot filter like this 
    projects.Where(x => x.Status == status); 
    var orderedProjects = projects.OrderBy(x => x.Name); 

    var projectList = orderedProjects.ToPagedList(pageNumber, pageSize); 

    var data = projectList.Select(x => ToDTO.ProjectBuild(x)).ToList(); 
    return new ListResult<ProjectDTO> { Data = data, TotalCount = projectList.TotalItemCount }; 
} 

Когда вы должны пропусканием перечисление

public async Task<ListResult<ProjectDTO>> GetListedProjects(int pageSize, int pageNumber, Status status) 

Вы можете также передать в строке, и создать Status переменную и с некоторые инструкции switch, вы можете установить правильное перечисление. Мне не нравится преобразовывать string в enum, как показывают некоторые из ответов. Ошибка, на мой взгляд, вам лучше попробовать либо A) разрешить строку Status, либо B) просто перейдите в перечисление Status, чтобы избежать конфликта.

+0

Или, для последнего абзаца, вы можете просто «TryParse».Представьте себе оператор 'switch' для перечисления размером 50 или 100, который используется для кодов выставления счетов в корпоративном продукте, он подвержен собственным ошибкам с помощью строк жесткого кодирования и представляет возможные правильные ошибки – ColinM

+0

. Хорошая точка зрения. – jdmdevdotnet

1

Перед тем как позвонить по телефону projects.Where(x => x.Status == status);, вы должны попытаться разобрать это строковое значение status в Перечень состояний.

Вы можете использовать либо Enum.Parse, который генерирует исключение, если синтаксический анализ не работает, либо вы можете использовать Enum.TryParse, который возвращает bool, основываясь на успешности/сбое операции синтаксического анализа.

+0

Да, это был просто черновик, просто хотел показать, что я хочу архивировать. – Martin

1

Вы можете разобрать значение строки:

private static TEnum? GetEnum<TEnum>(string value) where TEnum : struct 
{ 
    TEnum result; 

    return Enum.TryParse<TEnum>(value, out result) ? (TEnum?)result : null; 
} 

public async Task<ListResult<ProjectDTO>> GetListedProjects(int pageSize, int pageNumber, string status) 
{ 
    var projects = await unitOfWork.ProjectRepository.Get(); 
    //i cannot filter like this 
    projects.Where(x => x.Status == GetEnum<Status>(status)); 
    var orderedProjects = projects.OrderBy(x => x.Name); 

    var projectList = orderedProjects.ToPagedList(pageNumber, pageSize); 

    var data = projectList.Select(x => ToDTO.ProjectBuild(x)).ToList(); 
    return new ListResult<ProjectDTO> { Data = data, TotalCount = projectList.TotalItemCount }; 
} 
Смежные вопросы