动态迭代EF实体

时间:2013-11-09 10:01:23

标签: c# linq entity-framework reflection entity-framework-5

我有这样的代码:

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,上面的代码是有效的。如何将colsrows集合作为我可以迭代的泛型集合?

2 个答案:

答案 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)