2017-01-31 67 views
0

有沒有辦法如何使用字符串篩選數據與枚舉屬性?如何通過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

你有作爲的方法'字符串status'的parametr使用?爲什麼不用'狀態狀態'來代替? – 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'。想象一下,對於用於公司產品中的帳單代碼的50或100尺寸枚舉的'switch'語句,它很容易出現自己的錯誤,通過硬編碼字符串和引入可能的拼寫錯誤 – 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 }; 
}