使用entity framework在运行时动态选择列

我有这样的现有function

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很新。

任何帮助,将不胜感激

谢谢

这可能有助于解决您的问题:

 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"); 

你可以使用Reflection,就像这样(没有经过测试的代码):

 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; } 

不要将字符串列名称作为参数传递,而是尝试传入lambda表达式,如:

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

这将最终为您提供列名称的​​智能感知,因此您可以避免在列名称输入错误时可能出现的错误。

有关此内容的更多信息: C#将Lambda表达式作为方法参数传递

但是,如果您必须保留相同的方法签名,即支持其他/遗留代码,那么您可以尝试这样做:

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

您可能需要稍微调整一下,我没有快速测试方法。