C#linq to sql – 动态选择表

我有以下场景:有一个数据库每年生成一个新的logTable。 它始于2001年,目前有11张桌子。 它们都具有相同的结构,因此具有相同的字段,索引,pk等。

我有一些叫做管理器的类 – 顾名思义 – 管理这个DB上的每个操作。 对于每个不同的表我有一个经理,除了这个logTable,我只有一个经理。

我已经阅读了很多内容并尝试了不同的东西,例如使用ITable动态获取表或者我的所有表都实现的接口。 不幸的是,我失去了强类型属性,因此我无法进行任何搜索或更新或任何事情,因为我无法使用logTable.Where(q=> q.ID == paramId)

考虑到这些表具有相同的结构,从2010开始搜索日志的查询可以是从2011年开始搜索日志的查询。

我只是问这个,因为我不想为每个表重写相同的代码,因为它们在结构上是相同的。

编辑

我正在使用Linq to SQL作为我的ORM。 这些表使用所有数据库操作,而不仅仅是选择。

只要每个查询返回相同的形状,就可以使用ExecuteQuery (“从LogTable中选择cols”+实例)。 请注意,ExecuteQuery是LINQ to SQL允许SQL注入的一种情况。 我将在http://www.thinqlinq.com/Post.aspx/Title/Does-LINQ-to-SQL-eliminate-the-possibility-of-SQL-Injection上讨论如何参数化ExecuteQuery。

考虑将所有日志放在一个表中并使用分区来保持性能。 如果这不可行,您可以创建一个视图,将所有日志表联合在一起,并在选择日志数据时使用它。 这样,当您添加新的日志表时,您只需更新视图以包含新表。

编辑继续最近的评论:

听起来你需要一个新的DBA,如果他不让你创建新的SP。 是的我认为可以定义ILogTable接口,然后让你的日志表类实现它,但这不允许你做GetTable() 。 你必须有一种DAL类和一个创建联合查询的方法,例如

 public IEnumerable 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快乐;-)

您可能希望查看Codeplex Fluent Linq to SQL项目 。 我从来没有使用它,但我熟悉在EF4中使用类似的映射技术的想法。 你可以创建一个单独的对象,并使用以下语法将其动态映射到不同的表:

 public class LogMapping : Mapping { public LogMapping(int year) { Named("Logs" + year); //Column mappings... } }