如何从T创建匿名对象?

时间:2019-04-26 06:13:23

标签: c# entity-framework anonymous-methods

我在EF上下文中有GetEntities方法。在某些情况下,我不想加载内存中实体的所有属性。我只想加载“选定”属性。我正在使用匿名对象仅获取特殊属性。例如,我有“产品”实体,而我仅获得“名称”和“成本”属性(仅供阅读)。

context.GetEntities<Product>().Select(a => new { a.Name,a.Cost }).ToList();

我在很多地方都在使用它。因此,我创建了PropertyNames集合,并且想要创建GetEntities方法来获取具有以下属性的实体:

 public object GetEntities<T>(IEnumerable<string> proeprtyNames) 
 {
     return //anonymous entities which have only proeprtyNames properties
 }

如何创建此方法?而且我也不知道方法的返回类型应该是什么

2 个答案:

答案 0 :(得分:2)

1),您需要创建一个存储库以接受TEntity作为通用类实体,并且在该存储库中,您必须创建一个方法,该方法只能从在Select表达式谓词中指定的数据库表。

public class Repository<TEntity> where TEntity : class
{
    private readonly DbContext _context;

    public Repository(DbContext context)
    {
        _context = context;
    }

    public List<TResult> GetEntities<TResult>(Expression<Func<TEntity, TResult>> selector) where TResult : class
    {
        return _context.Set<TEntity>().Select(selector).ToList();
    }
}

2),然后在使用上述存储库时,您只能传递Product实体中要检索的属性,如

Repository<Product> repository = new Repository<Product>(new MySqlDbContext());

var anonymousResultSet = repository.GetEntities(x => new { x.Name, x.Cost });  //<= Here you can specify those columns that you want to retrieve.

return anonymousResultSet;

答案 1 :(得分:0)

您可以使用Repository pattern解决此问题。

创建Repository类,例如;

public class Repository<T> where T : class
{
    private readonly DbContext _dbContext;
    private readonly DbSet<T> _dbSet;

    public Repository(DBContext dbContext)
    {
        _dbContext = dbContext;
        _dbSet = dbContext.Set<T>();
    }


    public IQueryable<T> GetAll()
    {
        return _dbSet;
    }
}

您的功能可以是

 public object GetEntities<T>() 
 {
     using (DBContext db = new DBContext())
     {
            Repository<T> repository = new Repository<T>(db);
            list = repository.GetAll();
            return list.ToList();
     }
 }