我想知道你对我们程序这部分的想法已经实现了: / P/ M- T/ q5 |: r# c& B- {在我们的数据库中有一个露营地清单。 : w' a4 p) `" b+ ?" ^合作伙伴打电话给我们,把所有的露营带到我们身边GPS所有提供酒吧的露营地(我们称之为服务)都在附近或提供给我们。 " J2 `5 }" N% K$ u那我是怎么意识到的呢? 1 A& [* [3 j, M0 {3 _' e' a这是我们的数据库:0 X7 Q* s8 @2 m. y) u
Campsite- ID- NAME- GPS_latitude- GPS_longitudeCampsiteServices-Campsite_ID-Services_ID所以我的代码(c#,但不相关,可以说是面向对象的语言)看起来像这样* a& L, X; k5 R# Z
public class SqlCodeCampsiteFilter{ public string SqlCode; public Dictionary Parameters;}interface ISQLCampsiteFilter{ SqlCodeEngineCore CreateSQLCode();}public class GpsLocationFilter : ISQLCampsiteFilter{ public float? GpsLatitude; public float? GpsLongitude; public SqlCodeEngineCore CreateSQLCode() { --return an sql code to filter on the gps location like dbo.getDistance(@gpsLat,@gpsLong,campsite.GPS_latitude,campsite.GPS_longitude) with the parameters }}public class ServiceFilter : : ISQLCampsiteFilter{ public int[] RequiredServicesID; public SqlCodeEngineCore CreateSQLCode() { --return an sql code to filter on the services "where ID IN (select CampsiteServices.Service_ID FROm CampsiteServices WHERE Service_ID in ...) }}所以在我的webservice代码中:* x6 o o" l- [) [ l, g+ ]# F% z8 x
List[I] filters = new List[I]();if(gps_latitude.hasvalue && gps_longitude.hasvalue){ filters.Add (new GpsLocationFilter (gps_latitude.value,gps_longitude.value));}if(required_services_id != null){ filters.Add (new ServiceFilter (required_services_id ));}string sql = "SELECT ID,NAME FROM campsite where 1=1"foreach(ISQLFilterEngineCore aFilter in filters){ SqlCodeCampsiteFilter code = aFilter.CreateSQLCode(); sql = code.SqlCode; mySqlCommand.AddParameters(code.Parameters);//add all the parameters to the sql command}return mySqlCommand.GetResults();1)我不使用ORM原因很简单,因为这个系统已经存在了10年,唯一一个从一开始就在这里的开发人员就开始了解公私的区别。; X0 v5 B0 X7 U
2)我不喜欢SP因为:我们可以重写,t-sql使用不那么有趣$ C( @& m: o8 a( l
那你怎么看 ?清楚吗 ?你有什么图案值得一看吗?7 \, C: _: w) r- F) ^, B
若不清楚,请询问2 j2 Z8 s" ?# \* Y
7 a' [0 K& y- } 解决方案: