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

Posted

技术标签:

【中文标题】在运行时将实体对象添加到 LINQ-to-SQL 数据上下文 - SQL、C#(WPF)【英文标题】:Adding Entity Objects to LINQ-to-SQL Data Context at Runtime - SQL, C#(WPF) 【发布时间】:2020-04-08 10:16:07 【问题描述】:

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

最终目标相对简单。我需要找到一种方法,通过存储过程将在运行时创建的表添加到 LINQ-to-SQL dbml 文件的当前数据上下文中。然后,我需要能够在这个新表对象上使用常规 LINQ 查询方法/扩展方法(InsertOnSubmit()、DeleteOnSubmit()、Where()、Contains()、FirstOrDefault() 等...)现有的数据上下文。本质上,我需要找到一种方法来以程序方式创建代码,否则当您在开发期间使用拖放方法时(应用程序未运行时)会自动生成该代码,但让它生成相同的代码同时应用程序正在通过命令和/或事件触发器运行。

更多详情

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

当前解决方案(使用一张表)

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

目标(使用多个表格)

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

最后的想法

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

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

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

感谢您阅读相当冗长的第一篇文章。欢迎任何 cmets/批评。

【问题讨论】:

【参考方案1】:

实现您想要的最简单的方法是在 SQL Server 中进行重定向,而无需理会您的客户端代码。在设计时创建 L2S 数据上下文,或 EF DbContex 引用只有一个表的数据库。然后在运行时替换指向“当前年份”表的该表的视图或同义词。

但是,这首先应该不是必需的。 SQL Server 支持partitioning,因此您可以将所有数据存储在物理上独立的数据结构中,但只有一个逻辑表。并且 SQL Server 支持columnstore 表,可以压缩和存储数百万行,性能出色。

【讨论】:

以上是关于在运行时将实体对象添加到 LINQ-to-SQL 数据上下文 - SQL、C#(WPF)的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时将onclick侦听器添加到游戏对象统一[重复]

在运行时将一个游戏对象组件添加到另一个具有值的游戏对象中

在运行时将类型 id 的对象转换为未知类型

通过 LINQ-to-SQl 加载数据集

在 BLL 或 UI 中使用 Linq-to-SQL 实体?

单击时将图像添加到屏幕并允许其可拖动/可旋转