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

本文关键字:静态 选择 列表 查询 数据库 | 更新日期: 2023-09-27 18:03:56

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

在本例中,选择列表需要访问数据库。手工编写列表是不可行的,因为列表可能会随着时间的推移而改变(因此需要数据库查询)。

虽然我没有编译器错误,页面显示按预期工作,但我不确定采用这种方法是否会产生其他问题。下面所示的代码方法是实现此结果的"坏"方法吗?有更好的方法吗?

总之,这就是我正在做的:

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

类:

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;
    }
}

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

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

该技术相对于您的技术的优势在于,在您的情况下,数据库中断总是在应用程序启动时发生,因为该方法是静态的,无论您是否要使用它。然而,通过使用缓存的方法,您在第一次调用该方法时就会导致数据库中断。