使用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)}); }
您可能需要稍微调整一下,我没有快速测试方法。