基于数据库查询的静态选择列表

时间:2016-08-25 18:37:21

标签: c# asp.net-mvc-5

在重构ASP.NET MVC 5 Web项目的过程中,我看到有机会将一些选择列表移动到另一个类,其中多个控制器可以访问它们。这将允许我删除重复的代码。

在这种情况下,选择列表需要访问数据库。手动编码可能随时间变化的列表是不可行的(因此,数据库查询)。

虽然我没有编译器错误且页面出现按预期工作,但我不确定是否通过采用这种方法创建其他问题。下面显示的代码方法是否是实现此结果的“坏”方法?有更好的方法吗?

总之,这就是我在做的事情:

  • 其中的类和方法是静态的
  • 私有静态只读数据库上下文在顶部
  • 定义
  • 显示的两个函数查询数据库并产生所需的结果。
  • 因为这是一个静态类,所以没有配置方法。

班级:

public static class ElpLookupLists
{
    private static readonly EllAssessmentContext Db = new EllAssessmentContext();

    // code...

    internal static IEnumerable<SelectListItem> StandardSelectList(string selectedDomain)
    {
        return Db.ElpStandardLists.Where(m => m.Domain == selectedDomain)
            .Select(m => m.Standard).Distinct()
            .Select(z => new SelectListItem { Text = z.ToString(), Value = z.ToString() }).OrderBy(z => z.Value)
            .ToList();
    }

    internal static IEnumerable<SelectListItem> PerformanceIndicatorSelectList(string selectedDomain, int? selectedStandard,
        string selectedSubConcept)
    {
        var query =
        Db.ElpStandardLists.Where(m => m.Domain == selectedDomain).Where(m => m.Standard == selectedStandard);
        if (!string.IsNullOrEmpty(selectedSubConcept)) query = query.Where(m => m.SubConcept == selectedSubConcept);
        var list =
            query.Select(m => m.PerformanceIndicator)
                .Distinct().OrderBy(m => m)
                .Select(z => new SelectListItem { Text = z.ToString(), Value = z.ToString() })
                .OrderBy(z => z.Text).ToList();
        return list;
    }
}

1 个答案:

答案 0 :(得分:2)

在我看来,更好的选择是创建一个单独的控制器,其中包含获取此数据的方法,您可以OutputCache这种方法。然后,您可以在其他控制器中调用此方法,并且每次都不会使数据库跳闸。返回值将被缓存。您当然可以控制缓存设置。

这种技术优于您的优势在于,在您的情况下,数据库跳转将始终在应用程序启动时发生,因为该方法是静态的,无论您是否打算使用它。而通过使用缓存方法,您可以在第一次调用方法时使数据库跳闸。