2014-08-28 60 views
0

我想知道是否有一种方法可以将我的代码动态地从上下文返回实体。例如,我使用的是下面的接收所有记录:动态选择上下文属性?

public List<AbandonCode> GetAbandonCodes() 
    { 
     List<AbandonCode> ab; 
     using (DataWarehouseEntities context = new DataWarehouseEntities()) 
     { 
      ab = (from a in context.AbandonCodes select a).ToList<AbandonCode>(); 
     } 
     return ab; 
    } 

什么IM希望做的就是创建一个类似的helper方法,但我想不出如何设置context.WhatIWantToGet也没有返回类型。它看起来类似于这样的:

public List<????> GetAbandonCodes(Type t) 
    { 
     List<t> ab; 
     using (DataWarehouseEntities context = new DataWarehouseEntities()) 
     { 
      ab = (from a in context.???? select a).ToList<t>(); 
     } 
     return ab; 
    } 

我试图做甚至可能吗?

回答

1

这里有几个不同的选项。这里是完全通用的一个使用Set < T>方法上的EF背景:

public List<T> GetAbandonCodes<T>() where T : class 
{ 
    List<T> ab; 
    using (DataWarehouseEntities context = new DataWarehouseEntities()) 
    { 
     ab = context.Set<T>().ToList(); 
    } 
    return ab; 
} 

...你会叫这样的:

var codes = GetAbandonCodes<AbandonCode>(); 

如果你想在一个类型对象传递,而不是调用泛型方法,那么可以使用非泛型Set()。这是一个有点麻烦,因为你必须将结果强制转换的东西可用:

public static DbSet GetAbandonCodes(Type t) 
    { 
     DbSet ab; 
     using (DataWarehouseEntities context = new DataWarehouseEntities()) 
     { 
      ab = context.Set(t); 
     } 
     return ab; 
    } 

然后,您可以使用它像这样:

var codes = GetAbandonCodes(typeof(AbandonCode)).Cast<AbandonCode>().ToList(); 

我建议第一种方法,不过,因为它是更安全,更易于使用。

+0

噢,'Set',很好。我应该刷新我的EF知识。 – 2014-08-28 01:01:16