在运行时将实体对象添加到 LINQ-to-SQL 数据上下文 - SQL、C#(WPF)

Adding Entity Objects to LINQ-to-SQL Data Context at Runtime - SQL, C#(WPF)

在使用 LINQ-to-SQL 将新实体对象(常规 SQL table)添加到数据上下文时,我遇到了困难。这与许多其他线程中经常引用的拖放方法无关。此方法反复使用没有问题。

最终目标相对简单。我需要找到一种方法,将在运行时 期间通过存储过程创建的 table 添加到 LINQ-to-SQL dbml 文件的当前数据上下文.然后,我将需要能够在这个新的 table 对象通过现有的数据上下文。本质上,我需要找到一种方法来按程序创建代码,否则当您在开发过程中使用拖放方法时(当应用程序不是 运行 时)会自动生成代码,但让它生成当应用程序通过命令 and/or 事件触发器 运行 时使用相同的代码。

更多详情

有一个 table 被广泛使用,并且在一整年的过程中收集了数千行。每行包含一个时间戳,这个 table 需要根据添加行的年份分成多个 table。

当前解决方案(使用一个table)

  • 单个 table 有数万行,不断被查询。
  • Table 在开发过程中使用拖放添加到数据上下文,因此没有额外的编码问题
  • 性能随时间显着下降

目标(使用多个 tables)

  • (完成)当应用程序为 运行 时,使用 C# 代码检查当前年份的 table 是否已存在。如果是,则不采取任何操作。如果不是,将使用存储过程创建一个新的 table,并将当前年份作为 table 名称的前缀(2017_TableName、2018_TableName、2019_TableName、等等……)。
  • (不完整)当应用程序仍然是 运行 时,将新创建的 table 添加到活动的 LINQ-to-SQL 数据上下文(相同的代码,否则在开发过程中使用拖放添加)。
  • (不完整)运行 针对新添加的 table.
  • 的常规 LINQ 查询

最后的想法

除上述内容外,我唯一关心的是如何编写引用可能已存在或可能不存在的 table 的 C# 代码。是否可以使用变量来代替标准 'DB_DataContext.2019_TableName' 方法,以便将 table 的数据实际获取到 UI 控件中?有没有一种方法可以简单地创建所有 table 的 Enumerable,其中名称以年份为前缀,然后是 select 最新的 table?

从我目前所读到的内容来看,最可能的解决方案似乎涉及使用 SQL 附加组件,例如 SQLMetal 或 Huagati(仅基于我的内容) ve read) 将在运行时生成我需要的代码并更新相应的 dbml 文件。我没有使用这些类型的附加组件的经验,所以任何对这些附加组件的额外见解将不胜感激。

最后,我看到了一些对 LINQ-to-Entities and/or LINQ-to-Objects 的引用。这些是我正在寻找的组件吗?

首先感谢您阅读相当冗长的文章 post。欢迎任何comments/criticisms。

实现您想要的最简单方法是在 SQL 服务器中重定向,并单独留下您的客户端代码。在设计时创建您的 L2S 数据上下文,或 EF DbContex 引用仅包含一个 table 的数据库。然后在 运行 时间替换指向 "current year" table.

的 table 的视图或同义词

然而,这本来就不是必需的。 SQL服务器支持partitioning, so you can store all the data in a physically separate data structures, but have a single logical table. And SQL Server supports columnstoretables,可压缩存储数百万行,性能优异。