具有公共列的表的DRY LINQ语句

时间:2009-03-25 20:56:52

标签: linq-to-sql dry

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

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

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

更新MyTable SET禁用= 1 WHERE ID = @ID或Parent_ID = @ID

我不想为每个实体编写这种LINQ语句,它违反了DRY。这个示例看起来似乎微不足道,但随着示例变得越来越复杂,您正在复制越来越多的代码。我确信它必须可以使用界面和可能的泛型,但我很难想出一个优雅的解决方案。

3 个答案:

答案 0 :(得分:1)

只需为您的实体创建一个基类,并将公共属性作为虚拟属性移动到它。覆盖实体中的这些属性,并在其上指定Column属性。这是一个详细的example

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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)如果需要,我可以将扩展方法放在它们自己的命名空间中,客户端可以将它们交换出来用于其他实现。

赞赏这种方法的评论