Как динамически искать свойство со значением в TEntity? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть объект типа TEntity, и я хочу выполнить поиск свойства Dynami c с заданным значением.

public virtual TEntity Get(string code)
{
    var type = typeof(TEntity);
    if (!type.GetProperties().Any(x => x.Name == Constants.Columns.CODE))
    {
        throw new InvalidOperationException($"{typeof(TEntity)} doesn't have any {Constants.Columns.CODE} property.");
    }

    return _entities.FirstOrDefault(x => type.GetProperty(Constants.Columns.CODE).GetValue(x).ToString() == code);
}

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вы можете использовать синтаксис доступа в стиле Shadow Property для любого свойства. Поэтому просто добавьте следующий метод к вашему DbContext:

public IQueryable<TEntity> FilterBy<TEntity, TValue>(string propertyName, TValue value) where TEntity : class
{
    return Set<TEntity>().Where(e => EF.Property<TValue>(e,propertyName).Equals(value));
}
0 голосов
/ 02 мая 2020

Для начала, я думаю, что следующий код мог бы помочь вам:

// Person Class
 public class Person
    {
        public string Name { get; set; }
        public uint Age { get; set; }
    }
  private static Person GetEntity(List<Person> personList, string propertyName, string propertyValue)
        {
            Person person = personList.FirstOrDefault(x =>
            {
                PropertyInfo a = x.GetType().GetProperties()
                                            .Where(y => y.Name == propertyName)
                                            .FirstOrDefault();     

                return a.GetValue(x)?.ToString() == propertyValue;
            });

            return person;
        }
  static void Main(string[] args)
        {
            List<Person> personList = new List<Person>()
            {
                new Person()
                {
                    Age=10,
                    Name="aa"
                },
                new Person()
                {
                    Age=20,
                    Name="bb"
                }
            };               

            //Get the first person of the list:
            Person p = GetEntity(personList, "Name", "aa");

            //....

Я не видел полностью ваш код, но я думаю, что применение этого изменения в последний раз строка кода, может работать:

 var _entity = _entities.FirstOrDefault(x =>
            {
                var properties = x.GetType().GetProperties()
                                            .Where(y => y.Name == Constants.Columns.CODE)
                                            .FirstOrDefault();     

                return properties.GetValue(x)?.ToString() == code;
            });

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