2

这是一个有趣的问题。有没有办法使用 LINQ to SQL 编写一些代码,它能够执行表更新,只知道给定的表包含列 x、y、z,但在编译时不知道它正在处理哪个表?

我的数据库模式中有几个表共享一些列,我需要应用一个基于集合的 UPDATE 操作,无论我们正在处理哪一个表,它的逻辑过程都是相同的。

这是一个简单的例子:假设您有 3 个实现邻接模型层次结构的表(即每行包含一个主键 ID 和一个自引用父 ID 列)。每个表还有一个“禁用”布尔标志。当我禁用任何这些实体的实例时,它应该通过子项级联,即

UPDATE MyTable SET Disabled = 1 WHERE ID = @ID 或 Parent_ID = @ID

我不想为每个实体编写这种 LINQ 语句,它违反了 DRY。这个例子可能看起来微不足道,但随着例子变得越来越复杂,你复制的代码数量也越来越多。我确信使用接口和泛型必须是可能的,但我正在努力想出一个优雅的解决方案。

4

3 回答 3

1

只需为您的实体创建一个基类并将通用属性作为虚拟属性移至它。在您的实体中覆盖这些属性并在它们上指定 Column 属性。这是一个详细的例子

于 2009-03-31T13:51:33.633 回答
1

LINQ to SQL 类只是支持 IQuery 接口的常规 .NET 类,它们将其转换为 SQL。(不完全是挥手)

您可以创建自己的 IQuery 实现并将其指向为相应表生成的 LINQ to SQL IQuery 实现。您添加一个名为“TableName”的属性并覆盖“Where”以支持它。

这个答案可能不是一个完整的解决方案,但我希望它可以为您指明正确的方向。

于 2009-03-31T14:04:04.447 回答
0

Ali 的解决方案会起作用(感谢您的输入),但在进行了更多研究后,我更喜欢的解决方案是使用接口和扩展方法的“混合”。

http://msdn.microsoft.com/en-us/vcsharp/bb625996.aspx

http://mikehadlow.blogspot.com/2008/05/interface-extension-methods-mixin.html

这有几个优点 1)我不必摆弄 VS2008 中 LINQ 类的自动生成机制来支持新的基类

2)它没有在我的 LINQ 类上强制继承层次结构,我只是在部分类声明中添加了一个接口,突然间所有这些新的共享功能都来了!

3) 如果需要,我可以将扩展方法放在他们自己的命名空间中,客户可以将它们换成其他实现。

对此方法的评论表示赞赏

于 2009-04-07T22:19:21.400 回答