我有以下场景:有一个数据库每年都会生成一个新的 logTable。它始于2001年,现在有11张 table 。它们都具有相同的结构,因此具有相同的字段、索引、pk 等。
我有一些称为管理器的类,顾名思义,它们管理此数据库上的每个操作。对于每个不同的表,我都有一个经理,除了这个 logTable,我只有一个经理。
我读了很多书并尝试了不同的方法,例如使用 ITable 动态获取表或我的所有表都实现的接口(interface)。不幸的是,我失去了强类型的属性,因此我无法进行任何搜索或更新或任何事情,因为我无法使用 logTable.Where(q=> q.ID == paramId)
.
考虑到这些表具有相同的结构,搜索 2010 年日志的查询可能与搜索 2011 年及以后日志的查询完全相同。
我问这个只是因为我不想为每个表重写相同的代码,因为它们在结构上是相同的。
编辑
我使用 Linq to SQL 作为我的 ORM。而且这些表使用了所有的数据库操作,而不仅仅是选择。
最佳答案
考虑将所有日志放在一个表中并使用 partitioning以保持性能。如果这不可行,您可以创建一个将所有日志表合并在一起的 View ,并在选择日志数据时使用它。这样,当您添加新的日志表时,您只需更新 View 以包含新表。
编辑 进一步到最近的评论:
如果他不允许您创建新的 SP,那么听起来您需要一个新的 DBA。是的,我认为可以定义一个 ILogTable 接口(interface),然后让您的日志表类实现它,但这不允许您这样做 GetTable<ILogTable>()
.您必须拥有某种 DAL 类,其中包含创建联合查询的方法,例如
public IEnumerable<ILogTable> GetLogs()
{
var Log2010 = from log in DBContext.2010Logs
select (ILogTable)log;
var Log2011 = from log in DBContext.2011Logs
select (ILogTable)log;
return Log2010.Concat(Log2011);
}
以上代码完全未经测试,可能会严重失败;-)
编辑让@AS-CII 开心 ;-)
关于C# linq to sql - 动态选择表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7179436/