【问题标题】:Entity Framework and Generic Type Parameter实体框架和泛型类型参数
【发布时间】:2016-04-04 19:03:49
【问题描述】:

我有一个数据库,其中包含从第三个来源导入的数百个表。使用实体框架,这些表变成了标记为 E_1、E_2、E_3 的 ObjectSet……所有的表都有一组共同的列,可以用一个函数来查询。

我有以下代码:

namespace Foo{
    public static class Data{

       public static MyEntities dataContext = new MyEntities();

       public static void getData<T>(string entityName) where T : class
       {
          string queryString = "SELECT result FROM ";
          queryString += Data.dataContext.DefaultContainerName + "." + entityName;

          ObjectQuery<T> myQuery = Data.dataContext.CreateQuery<T>(queryString, null);

        // do stuff
       }

       public static void test(){
         string entityName = "E_1";
         Data.getData<E_1>(entityName);
       }
}

在 test() 中,我将字符串“E_1”传递给函数 getData(),并将类型类 Foo.E_1 作为泛型类型参数插入到 getData 中。

实际上,E_1 直到运行时才知道。在运行时,我创建了 entityName 字符串,但是我怎样才能将此字符串转换为 getData 所需的通用参数类型?

谢谢。

【问题讨论】:

  • 您需要确保 E_1 是一个类才能将其用作泛型类型约束/参数

标签: c# entity-framework generic-type-argument


【解决方案1】:

所有表都有一组共同的列

因此您可以创建一个类(例如 MyImportType)来捕获查询结果,并使用 ExecuteStoreQuery 代替 ObjectQuery

var data = Data.dataContext.ExecuteStoreQuery<MyImportType>(queryString);

而且 getData 不需要泛型类型参数。

顺便说一句:我同意 TomTom 的观点,即数据库设计非常糟糕。如果可以,至少将具有相同列的表合并到一个表中。

【讨论】:

  • 谢谢,效果很好! (数据库设计并不像看起来那么糟糕。我为这个例子简化了它来解决这个问题。)
【解决方案2】:

实际上,E_1 直到运行时才知道

Anjd 实际上是:

  • 非常糟糕的数据库设计和
  • Entity Framework 不支持的东西。

就这么简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多