如何为DbSets制作通用方法?

时间:2014-10-29 12:45:19

标签: c# entity-framework generics

我有很多这样的类似meyhod:

    public static List<MyCatalogViewModel> LoadCatalog1(...)
    {
       var catalog= DbContext.MyContexClass1.Where(t => !t.Deleted).Select(k=> new MyCatalogViewModel{ Id= k.Id, Name = k.Name}).ToList();
       return catalog;
    }

    public static List<MyCatalogViewModel> LoadCatalog2(...)
    {
       var catalog= DbContext.MyContexClass2.Where(t => !t.Deleted).Select(k=> new MyCatalogViewModel{ Id= k.Id, Name = k.Name}).ToList();
       return catalog;
    }

我从DbContext获取数据。差异仅在DBSet<> 我如何制作通用方法而不是这种方法?

MyContexClass2MyContexClass1都有属性IdName。看起来像:

public partial class MyContexClass1: AccountableDbObject
{
    public MyContexClass1()
    {
      <..some code..>
    }

    public override int Id{ get; internal set; }
    public string Name { get; set; }

     <...Another properties...>
}

1 个答案:

答案 0 :(得分:3)

DbContext有一个Set<T>方法,允许检索一组任意实体(只要它们的类型在上下文中注册)。

<强>更新

要实际使用在这些泛型类型上定义的属性,您需要模型类来实现公共接口:

public interface ICatalogItem { //or some other name 
      bool Deleted { get; }
      int Id { get; }
      string Name { get; }
}

E.g。您的MyContexClass1定义将变为

MyContexClass1 : AccountableDbObject, ICatalogItem

现在,您可以构建一个返回相应视图模型的通用方法:

public static List<MyCatalogViewModel> LoadCatalog<T>()
    where T : class, ICatalogItem
{
   var catalog= DbContext.Set<T>.Where(t => !t.Deleted).Select(k=> new MyCatalogViewModel{ Id= k.Id, Name = k.Name}).ToList();
   return catalog;
}