Динамически выбирать столбцы во время выполнения с помощью entity framework

у меня есть функция, как это

public int sFunc(string sCol , int iId)
{
    string sSqlQuery = "  select  " + sCol + " from TableName where ID = " +  iId ;
    // Executes query and returns value in column sCol
}

таблица имеет четыре столбца для хранения целочисленных значений, и я читаю их отдельно, используя функцию выше.

теперь я преобразую его в Entity Framework .

public int sFunc(string sCol , int iId)
{
     return Convert.ToInt32(TableRepository.Entities.Where(x => x.ID == iId).Select(x => sCol ).FirstOrDefault());
}

но вышеуказанная функция возвращает ошибку

входной строки не в правильном формате

потому что он возвращает само имя столбца.

Я не знаю, как решить это Я очень новичок в EF.

любая помощь будет оценили

спасибо

5 ответов


Это может помочь решить вашу проблему:

public int sFunc(string sCol, int iId)
{
    var _tableRepository = TableRepository.Entities.Where(x => x.ID == iId).Select(e => e).FirstOrDefault();
    if (_tableRepository == null) return 0;

    var _value = _tableRepository.GetType().GetProperties().Where(a => a.Name == sCol).Select(p => p.GetValue(_tableRepository, null)).FirstOrDefault();

    return _value != null ? Convert.ToInt32(_value.ToString()) : 0;
}

этот метод теперь работает для динамически входного параметра метода sCol.


вы должны попробовать с динамическим LINQ. Подробности здесь


вы можете сделать это:

        var entity = _dbContext.Find(YourEntity, entityKey);
        // Finds column to select or update
        PropertyInfo propertyInfo = entity.GetType().GetProperty("TheColumnVariable");

вы можете использовать отражение, что-то вроде этого (не проверенный код):

public string sFunc(string sCol , int iId)
{
  var row = TableRepository.Entities.Where(x => x.ID == iId);
  var type = typeof(row);
  var propInfo = type.GetProperty(sCol);

  if (propInfo != null)
  {
    string value = (string)propInfo.GetValue(row);

    return value;
  }

  return null;
}

вместо передачи имени столбца строки в качестве параметра попробуйте передать лямбда-выражение, например:

sFunc(x => x.FirstColumnName, rowId);
sFunc(x => x.SecondColumnName, rowId);
...

это в конце концов даст вам intellisense для имен столбцов, поэтому вы избегаете возможных ошибок, когда имя столбца ошибочно.

подробнее об этом здесь: C# передать лямбда-выражение в качестве параметра метода

однако, если вы должны сохранить ту же сигнатуру метода, т. е. поддерживать другой / устаревший код, вы можете попробовать это:

public string sFunc(string sCol , int iId)
{
    return TableRepository.Entities.Where(x => x.ID == iId).Select(x => (string) x.GetType().GetProperty(sCol).GetValue(x)});
}

возможно, вам придется немного настроить это, у меня не было быстрого способа проверить это.