我有这样的代码:
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'等而不是遍历我的所有entites,上面的代码是有效的。如何将cols
和rows
集合作为我可以迭代的泛型集合?
答案 0 :(得分:0)
您使用strign参数调用typeof
,但是typeof是编译时构造,因此您不能以这种方式使用它。
相反,您可以使用Type.GetType(string)
。您将需要传递完整的命名空间和类型名称,因此Entity1
可能无法正常工作,它可能会期望MyApplication.Entities.Entity
的某些内容。
如果要完全动态加载实体,还可以使用Assembly.Load
将包含实体的程序集加载到内存中,然后使用Assembly.GetType
加载类型本身。
请记住,实体也可以具有未映射到数据库列的属性,当有人使用部分类扩展生成的类或使用Entity Framework Code First手动编写类时,就是这种情况。
答案 1 :(得分:0)
我有同样的问题并发现了这篇文章。但是因为没有标记&#34;已解决&#34;在这里 - 我创建了自己的问题:EF get list of records in runtime from Type ... 我刚刚得到了一个简单而又恰到好处的答案。我在想它是否也可以解决这个问题? 这是@Matt在Question给出答案的简单路线,为您提供了一些机会:
dbContextInstance.Set(type)