如何仅使用一个控制器动态检索表?

Posted

技术标签:

【中文标题】如何仅使用一个控制器动态检索表?【英文标题】:How to retrieve table dynamically using only one controller? 【发布时间】:2016-05-12 22:33:54 【问题描述】:

我使用以下代码作为单个表的控制器来访问我的数据库中的表,并将每列的值分配给一个变量。但是,我有很多表(在这种情况下是 Booktrans),我想使用一个控制器,它可以使用表 ID 作为变量来访问所有表。之后,从不同的表中为不同的列赋值也会和下面的代码不同。谁能帮我用一种“动态”的编码方式来用动态控制器替换特定表的这个控制器?

我正在使用 MVC4。

所有的表都有不同的结构和不同的列名。

public ActionResult Booktrans()

    String connectionString = "Dsn=SECURE;Uid=internwebuser";
    OdbcConnection conn = new OdbcConnection(connectionString);
    String sql = "SELECT * FROM booktrans";
    OdbcCommand cmd = new OdbcCommand(sql, conn);

    var model = new List<Booktrans>(); 

    using (conn)
    
        conn.Open();
        OdbcDataReader rdr = cmd.ExecuteReader();
        //model = new List<Booktrans>();
        while (rdr.Read())
        
            var book = new Booktrans();
            book.ship_last_name = rdr["ship_last_name"].ToString();
            book.ship_first_name = rdr["ship_first_name"].ToString();
            book.ship_zip = rdr["ship_zip"].ToString();
            book.ship_state = rdr["ship_state"].ToString();
            book.ship_address = rdr["ship_address"].ToString();
            book.ship_city = rdr["ship_city"].ToString();
            book.day_phone = rdr["day_phone"].ToString();
            book.email_address = rdr["email_address"].ToString();


            model.Add(book);
        

    
    return View(model);

【问题讨论】:

您期待动态类型列表还是强类型列表(例如:Booktrans)? 我不太明白你的问题。我对该控制器的看法如下。我不想为所有表分别设置一个控制器。 @foreach(模型中的 var book) @book.ship_first_name @book.ship_last_name @book.ship_address @book.ship_city,@book.ship_state @book. ship_zip 当天电话:@book.day_phone 邮箱:@book.email_address After that, assigning values of different columns from different tables will also be different from the code below - 仅此语句就应该告诉您尝试将所有这些组合到一个函数中时有些“气味”。如果每个表都不一样,表中的列也不一样,那你应该有不同的功能! en.wikipedia.org/wiki/Single_responsibility_principle @Shyju - 他希望代码动态地确定它正在从哪个表查询并根据表类型切换返回。基本上,将整个 DAL 组合成一个函数就是我的解释。 我问的原因是,他可能能够像 Dapper 一样返回动态类型列表。 【参考方案1】:

您如何使用实际的 ORM,因为这就是您要在此处进行逆向工程的内容。使用 Entity Framework 之类的东西,您可以创建一个映射到特定表的实体类,并且该类具有映射到该表中的列的属性。然后,特别是使用 Entity Framework,您将代表此表中行集合的 DbSet 添加到您的上下文中:

public DbSet<Foo> Foos  get; set; 

这样,您就可以简单地使用实体框架提供的 API 与该数据进行交互:

// Get specific Foo
var foo = db.Foos.Find(id);

// Get matching Foos
var foos = db.Foos.Where(m => m.Bar == "bar");

// Add a new Foo
db.Foos.Add(new Foo  Bar = "bar" );

如此等等。 NHibernate 等其他 ORMS 的设置和 API 略有不同,但它们的行为基本相同,不需要您担心生成 SQL。

【讨论】:

以上是关于如何仅使用一个控制器动态检索表?的主要内容,如果未能解决你的问题,请参考以下文章

cakephp从另一个表中将数据检索到控制器中

使用 CloudKit 和 Swift 检索图像

从数据库中动态检索 Spring Boot CORS 配置以获取控制器中的特定方法

核心数据 - 保存和检索属性 - 示例代码

然后是一个具有动态列swift 4的动态表

如何使用动态变量作为在 python 中检索表值的键?