我有一个 DbSet<T>
我想通过名称访问它的一个属性。
这个可能吗?
我基本上正在创建一个通用函数,所以对于任何我拥有的DbSet
,我可以指定一个列并列出该列的值。
您可以通过执行context.Set(T)
从上下文中获取DbSet
本身,但我不确定字段。
我有一个 DbSet<T>
我想通过名称访问它的一个属性。
这个可能吗?
我基本上正在创建一个通用函数,所以对于任何我拥有的DbSet
,我可以指定一个列并列出该列的值。
您可以通过执行context.Set(T)
从上下文中获取DbSet
本身,但我不确定字段。
我之前用反射做过类似的事情。
T item = context.Set(T).First();
string propName = "MyProperty";
object value = item.GetType().GetProperty(propName).GetValue(item, null);
当然,请注意,您需要手动将值转换为特定类型,或使用ToString
,这在所有基本类型上都可以很好地工作。
这假定您已经从服务器获取了数据,现在需要处理它。
编辑:
如果您想创建查询,则可以使用this找到所需内容!
显然,您要查找的内容现在作为Entity Framework的一部分提供。
有一个可用的扩展方法,允许您使用.Select("propertyName")
返回IQueriable
。请记得将System.Linq.Dynamic
添加到您的using
部分。
然后,您可以通过指定参数名称来创建选择查询。
List<object> data = (db.Set<SetType>()
.Where("propertyName == @0 && someOtherProperty == @1", propertyValue, someOtherPropertyValue)
.Select("propertyName") as IEnumerable<object>).ToList();
dbSet.Where(c => c.GetType().GetProperty(propertyName).GetValue(c, null) == someString)
- NibblyPigWhere
子句。我还编辑了我的回答,以包含一个示例Where
。如果你仍然有问题,那么你需要更具体地说明。 - MBender请查看关于动态LINQ的这篇文章。
使用提供的代码,我能够编写一个LINQ到实体的查询,如下所示:
var query = context.Set(Type.GetType("Person")).Select("Name");
context.Set()
不可用吗? - RHarris
IEnumerable<T>
。 - NibblyPig