Как создать анонимный объект из T? - PullRequest
1 голос
/ 26 апреля 2019

У меня есть метод GetEntities в контексте EF. В некоторых случаях я не хочу загружать все свойства сущностей в память. Я хочу загрузить только «выбранные» свойства. Я использую анонимный объект для получения только специальных свойств. Например, у меня есть сущность Product, и я получаю только свойства Name и Cost (ТОЛЬКО ДЛЯ ЧТЕНИЯ).

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 ]

2 голосов
/ 26 апреля 2019

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;
0 голосов
/ 26 апреля 2019

Вы можете использовать Шаблон репозитория для этой проблемы.

Создать Repository class like;

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();
     }
 }
...