是否有一种有效的方法来使用两个变量进行选择语句?

5 c# linq

在我的C#代码中,我需要评估两个非null变量.我制定了一组if-else if语句,但在我看来它看起来很丑陋而且有点过于草率,即使它是正确的.

我查看了MSDN Library,只查看了基于单个变量的选择示例.

是否有更清洁,更紧凑的方式来实现相同的结果?

更新:我填写代码以提供更多上下文.再看一下,也许我可以根据参数直接操作linq查询.但是,我提出的问题我想要关注的通用问题:选择而不是选择后使用的代码.

public ActionResult Index(string searchBy, string orderBy, string orderDir)
{
    var query = fca.GetResultsByFilter(searchBy);

    if (orderBy == "Campus" && orderDir == "Asc")
    {
        query = query = query.OrderBy(s => s.Campus).ThenBy(s => s.Student_Name);
    }
    else if (orderBy == "Campus" && orderDir == "Desc") 
    {
    query = query.OrderByDescending(s => s.Campus);
    }
    else if (orderBy == "Student Name" && orderDir == "Asc")
    {
        query = query = query.OrderBy(s => s.Student_Name);
    }
    else if (orderBy == "Student Name" && orderDir == "Desc")
    {
        query = query.OrderByDescending(s => s.Student_Name);
    }
    else if (orderBy == "Course Count" && orderDir == "Asc")
    {
    query = query.OrderBy(s => s.Course_Count);
    }
    else if (orderBy == "Course Count" && orderDir == "Desc")
    {
    query = query.OrderByDescending(s => s.Course_Count);
    }
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*oss 4

您可以使用或创建一个扩展方法来IQueryable处理排序:OrderByOrderByDescending

public static class QueryableExtensions
{
    public static IOrderedQueryable<TSource> OrderByWithDirection<TSource,TKey>
        (this IQueryable<TSource> source,
        Expression<Func<TSource, TKey>> keySelector,
        string orderDir)
    {
        return orderDir == "Desc" 
                        ? source.OrderByDescending(keySelector)
                        : source.OrderBy(keySelector);
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设你的GetResultsByFilter方法返回一个IQueryable<>. 如果它实际上返回一个IEnumerable<>,那么扩展方法将需要接受一个IEnumerable<TSource> source参数并返回一个IOrderedEnumerable<TSource>

然后可以按如下方式使用:

public ActionResult Index(string searchBy, string orderBy, string orderDir)
{
    var query = fca.GetResultsByFilter(searchBy);

    switch (orderBy)
    {
        case "Campus":
            query = query.OrderByWithDirection(s => s.Campus, orderDir);
            break;
        case "Student Name":
            query = query.OrderByWithDirection(s => s.Student_Name, orderDir);
            break;
        case "Course Count":
            query = query.OrderByWithDirection(s => s.Course_Count, orderDir);
            break;
    }

    if (orderBy == "Campus" && orderDir == "Asc")
    {
        // The Campus Asc case was also ordered by Student_Name in the question.
        query = query.ThenBy(s => s.Student_Name);
    }
}
Run Code Online (Sandbox Code Playgroud)