如何创建列出数据库中数据的通用实现?

时间:2018-08-21 10:51:55

标签: c# generics abstract-class

我的数据库中有大量的表在本质上支持数据。这些表列出了国籍,性别,语言等,并且都基于相同的数据模型:

public class SupportDataModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Deleted { get; set; }
}
public class Gender : SupportDataModel
{
}

此数据主要在DropDownList控件中显示,因此我需要查询每个表以获取列表。由于我不需要每次访问数据时都必须重写此查询,因此将其编写为辅助类:

public class GendersHelper : IAlternateHelper<Gender>
{
    public List<Gender> ListItems()
    {
        using (var db = new ApplicationDbContext())
        {
            return db.Genders.Where(x => !x.Deleted).ToList();
        }
    }
}

对于这些类中的每一个,该函数除了在其查询的表中均相同。这就是为什么我想编写一个类,该类使用传入的类型作为我要查询哪个表的决定因素,但是我不知道该怎么做。

这是我到目前为止所拥有的...

public abstract class SupportingDataHelper<T>
{
    public List<T> ListItems()
    {
        // Logic to determine which table gets queried,
        // as well as the query itself should go here.
    }
}

如何获取此方法以确定要查询的表的类型,然后返回这些项的列表?

1 个答案:

答案 0 :(得分:2)

您可以只使用DbContext.Set<T>来返回所选类型的集合:

public class SupportDataRepository<T> where T : SupportDataModel
{
    public List<T> ListItems()
    {
        using (var db = new ApplicationDbContext())
        {
            return db.Set<T>().Where(x => !x.Deleted).ToList();
        }
    }
}

但是,我不会将其称为Helper类,因为它看起来更像是一个存储库。

要考虑的另一件事是,您绝对不想创建一个空类,例如:

public class Gender : SupportDataModel
{
}

因为它没有多大意义。也许您可能想使用enum属性来定义SupportDataModel的类型。在这种情况下,您将只有一个表(尽管有更多行),一个具有简单存储库类且没有继承或泛型的简单类。