Получить значение анонимного объекта в анонимном методе - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь написать общий метод, такой как:

protected async Task<ResultModel<TU>> GetEntityByIdAsync<TU, TKey>(TKey id) where TU : class
    {
        try
        {
            var result = await _db.Set<TU>().FirstOrDefaultAsync(x =>
                x.GetType().GetProperty("Id").GetValue(???).ToString() == id.ToString());
            return result.ToResultModel();
        }
        catch (Exception ex)
        {
            _logger.Error($"Error In GetEntityByIdAsync {typeof(TU).Name}. Error: {ex}");
            throw;
        }
    }

, но я не могу понять, что мне положить в GetValue(???).любая помощь?

1 Ответ

0 голосов
/ 30 ноября 2018

Хотя вы можете заставить его работать так, как вы пытаетесь это сделать, вы обнаружите, что Entity Framework Core не в состоянии анализировать код отражения, то есть он будет запускать FirstOrDefaultAsync в памяти.Таким образом, если у вас есть таблица с 1000 строками, все эти строки будут извлечены из базы данных и отфильтрованы там.Есть несколько решений:

  1. Используйте метод DbSet.Find , похоже, он сделает именно то, что вы пытаетесь достичь.Например:

    var entity = await _db.Set<TU>().FindAsync(id)
    
  2. Сделайте так, чтобы ваши сущности реализовали общий интерфейс, например:

    public interface IEntity
    {
        int Id { get; }
    }
    

    То есть ваши сущности будут выглядеть примерно так:

    public class SomeEntity : IEntity
    {
        public int Id { get; set; }
    }
    

    И, наконец, ваш метод теперь выглядит намного проще:

    protected async Task<ResultModel<TU>> GetEntityByIdAsync<TU, TKey>(TKey id)
        where TU : IEntity
    {
        return await _db.Set<TU>.FirstOrDefaultAsync(x => x.Id == id);
    }
    
  3. Создайте выражение вручную.Это намного сложнее, и я не собираюсь показывать, как это сделать, поскольку в этой ситуации это почти наверняка не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...