0

我有这样的代码:

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”等而不是循环遍历我的所有实体,则上面的代码有效。如何让colsandrows集合成为可以迭代的通用集合?

4

2 回答 2

0

我有同样的问题并找到了这篇文章。但是由于这里没有“已解决”的标记 - 我创建了自己的问题:EF get list of records in runtime from Type ...我只是得到了一个简单的答案,正是我所需要的。我在想它是否也可以解决这个问题?正是@Matt 作为我的问题的答案给出的这条简单的线为您提供了一些机会:

dbContextInstance.Set(type)
于 2014-10-22T06:41:53.920 回答
0

您使用typeofstrign 参数进行调用,但 typeof 是编译时构造,因此您不能以这种方式使用它。

相反,您可以使用Type.GetType(string). 您将需要传递完整的命名空间和类型名称,因此Entity1可能无法正常工作,它可能会期望类似于MyApplication.Entities.Entity.

如果要完全动态加载实体,还可以使用Assembly.Load将包含实体的程序集加载到内存中,然后用于Assembly.GetType加载类型本身。

请记住,实体也可以具有未映射到数据库列的属性,当有人使用分部类扩展生成的类或使用实体框架代码优先手动编写类时就是这种情况。

于 2013-11-09T19:49:11.707 回答