我有这样的代码:
public static void ImportData()
{
string[] entites = new string[]
{
"Entity1",
"Entity2",
"Entity3"
};
using (var db = new DatabaseContext())
{
foreach (var entity in entites)
{
// the next two lines don't compile,
// i'm just including them to show my intentions
List<string> cols = typeof(entity).GetProperties().Select(a => a.Name).ToList();
List<entity> rows = db.entity.ToList();
foreach (var row in rows)
{
foreach (var col in cols)
{
// do stuff
var propertyInfo = row.GetType().GetProperty(col);
var propertyType = propertyInfo.PropertyType;
if (propertyType == typeof(double?))
{
var val = (double?)row.GetType().GetProperty(col).GetValue(row);
// do stuff
}
else if (propertyType == typeof(decimal?))
{
var val = (decimal?)row.GetType().GetProperty(col).GetValue(row);
// do stuff
}
}
}
}
}
}
我遇到的问题是entities
- 即如果我实际使用"Entity1"等而不是遍历我所有的 entis,上面的代码就可以工作。如何使cols
和rows
集合成为可以迭代的泛型集合?
你用 strign 参数调用typeof
,但 typeof 是一个编译时构造,所以你不能以这种方式使用它。
相反,您可以使用 Type.GetType(string)
.您将需要传递完整的命名空间和类型名称,因此Entity1
可能不起作用,它可能会期望类似于MyApplication.Entities.Entity
。
如果要完全动态加载实体,还可以使用 Assembly.Load
将包含实体的程序集加载到内存中,然后使用 Assembly.GetType
加载类型本身。
还可以具有未映射到数据库列的属性,当有人使用分部类扩展生成的类或使用实体框架代码优先手动编写类时,就是这种情况。
我遇到了同样的问题并找到了这篇文章。但是由于这里没有"已解决"的标记 - 我创建了自己的问题:EF 从 Type 获取运行时的记录列表......我刚刚得到了一个简单而正是我所需要的答案。我在想它是否也可以解决这个问题?正是这句简单的台词@Matt作为对我问题的回答,给了你一些机会:
dbContextInstance.Set(type)