表示SQL查询的方法中的SRP

时间:2017-07-23 20:21:38

标签: sql vb.net oop design-patterns

我正在开发一个访问数据库的应用程序,现在我想知道这里的最佳做法是什么。

也许是一个愚蠢的问题,但后来我想确保它是愚蠢的:P

我有表示这样的查询的方法:

Public Function GetCellVposOfTransmitter(transmitter As VPos) As VPos
    Return (From position In Dc.VPos
            Join article In Dc.Art
            On position.ArtID Equals article.ArtID
            Where position.VID = transmitter.VID And position.Pos = transmitter.Pos And article.WGrp = 52 
            Select position).FirstOrDefault()
End Function

Public Function GetPressureTransmittersFromProcessId(processId As Integer) As IQueryable(Of VPos)
    Return From position In Dc.VPos
           Join article In Dc.Art
           On position.ArtID Equals article.ArtID
           Where position.SPos = 0 And position.VID = processId And article.WGrp = 33 
           Select position
End Function

在这种情况下,我首先调用GetPressureTransmittersFromProcessId以获取与给定进程关联的设备集合,然后对于每个返回的项目,我调用GetCellVposOfTransmitter以获取每个设备中内置的测量单元。

现在每个方法只有一个责任,并且尽可能简单,但是我查询了两次数据库,在这种情况下更多,因为我每次循环收集和查询。

我可以用一个返回的查询来编写一个方法,例如一个Dictionary(Of Vpos,Vpos),它包含每个设备作为密钥,关联的单元格作为值。 所以我只会查询一次,但我打破(或者我不是?)SRP ......

这里最好的做法是什么?我的意思是,这里有什么优先级,代码或服务器性能?我的应用程序不会超载任何服务器(lol),但只是要知道。

1 个答案:

答案 0 :(得分:1)

由于您创建了一个返回不同数据视图的方法,因此不会破坏SRP。新方法的责任是不同的。服务器性能在这里排在第一位。如果您担心代码重复,可以将方法链接在一起。例如,假设您想要编写一个方法,替换您的循环并仍在其他地方使用方法GetPressureTransmittersFromProcessId,您可以这样做:

Public Function GetCellVposOfTransmittersFromProcessId(processId As Integer) As IQueryable(Of VPos)
    Return  From transmitter In GetPressureTransmittersFromProcessId(processId)
            Join position In Dc.VPos On transmitter position.VID Equals transmitter.VID And position.Pos Equals transmitter.Pos
            Join article In Dc.Art On position.ArtID Equals article.ArtID
            Where article.WGrp = 52 
            Select position
End Function