【发布时间】:2010-03-19 23:56:34
【问题描述】:
我想知道您对我们计划的这一部分实现的看法:
我们的数据库中有一个露营地列表。
合作伙伴致电我们以获取 GPS 位置附近的所有露营地或提供酒吧(我们称之为服务)的所有露营地。
那我是怎么意识到的呢?
这是我们的数据库:
Campsite
- ID
- NAME
- GPS_latitude
- GPS_longitude
CampsiteServices
-Campsite_ID
-Services_ID
所以我的代码(c# 但它不相关,假设它是一种 OO 语言)看起来像这样
public class SqlCodeCampsiteFilter{
public string SqlCode;
public Dictionary<string, object> 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 ...)
}
}
所以在我的网络服务代码中:
List<ISQLFilterEngineCore> filters = new List<ISQLFilterEngineCore>();
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 年了,并且从一开始就在这里的唯一开发人员开始了解公共和私人之间的区别。
2) 我不喜欢 SP,因为:我们可以做覆盖,而 t-sql 用起来不是很有趣:)
那你怎么看?清楚吗 ?你有什么我应该看看的模式吗?
如果有不清楚的地方请追问
【问题讨论】: