C#linq to sql - 动态选择表

时间:2011-08-24 17:05:28

标签: c# linq-to-sql dynamic

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

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

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

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

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

修改

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

3 个答案:

答案 0 :(得分:2)

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

编辑继续最近的评论:

如果他不允许你创建新的SP,那么你需要一个新的DBA。是的我认为可以定义ILogTable接口,然后让你的日志表类实现它,但这不允许你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快乐; - )

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

只要每个查询返回相同的形状,就可以使用ExecuteQuery&lt; Log&gt;(“从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。