Динамически выбирать столбцы во время выполнения с помощью 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
.
вы можете сделать это:
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)});
}
возможно, вам придется немного настроить это, у меня не было быстрого способа проверить это.