如何仅使用一个控制器动态检索表?
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) 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。
【讨论】:
以上是关于如何仅使用一个控制器动态检索表?的主要内容,如果未能解决你的问题,请参考以下文章