2017-01-31 15 views
0

文字列を使用して列挙型プロパティでデータをフィルタリングする方法はありますか?LINQの文字列から列挙型でフィルタリングする方法C#

これは、ページング機能に2つの引数をとるサービスレイヤーの私の機能であり、3番目の引数はステータスでプロジェクトをフィルタリングするためのものです。

私は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でnullチェックを行うか、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文は、正しいenumに設定することができます。私はstringenumに変換するのが好きではありません。エラーが発生しやすいと思うのですが、A)文字列をStatusに解決するか、B)Status列挙型を渡して競合を避ける方が良いです。

+0

また、最後の段落については、 'TryParse'だけでよいでしょう。企業製品の請求コードに使用されている50または100サイズのenumの 'switch'ステートメントを想像してください。文字列のハードコーディングとスペルミスの可能性があります。 – ColinM

+0

非常に真です。いい視点ね。 – jdmdevdotnet

1

projects.Where(x => x.Status == status);に電話する前に、その文字列値statusをStatus Enumに解析してください。

構文解析が失敗した場合は例外をスローするEnum.Parseを使用するか、構文解析操作の成功/失敗に基づいてboolを返すEnum.TryParseを使用できます。

+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 }; 
} 
関連する問題