我在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
}
如何创建此方法?而且我也不知道方法的返回类型应该是什么
答案 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();
}
}