试图找出实现这一目标的最佳方法。所以我有一个带有属性的商店表:
StoreID,名称,纬度,经度等
我正在使用ADO.NET数据服务(Astoria)创建一个Web服务,该服务将显示给定半径和坐标的附近商店。我做了一个服务操作来获取参数并将结果作为IQueryable返回。到目前为止一切都很好。
所以现在我有类似的东西:
return context.Stores.Where(...distance calculation...);
这很好用,但我也希望从给定的半径返回每个商店的距离。我有计算,但我应该如何包括距离和商店数据?我应该创建一个像StoreSearchResult这样的类,它具有Store和Distance的属性吗?
如果我只是使用SQL,我可以编写一个数据库查询,它将返回Store的所有数据,以及一个距离列。类似的东西:
Select StoreID, Name, Latitude, Longitude, (calculation...) as Distance
from Store
where ...distance param...
所以我正在寻找最好的方式来发回原始商店数据+距离计算,同时仍然返回IQueryable。我不想采用IEnumerable并使用AsQueryable ...我觉得应该可以让它“接近”数据库查询,我可能只是遗漏了一些东西。
答案 0 :(得分:0)
编写一个包含商店和距离的结构可能会更好,然后将它们添加到匹配列表中
List<StoreSearchResult> matches = new List<StoreSearchResult>();
foreach (Store store in Stores)
{
int distance = ...distance calc...
if (distance < searchArea)
{
matches.Add(new StoreSearchResult(store, distance);
}
}
return matches;
或者,您可以将当前搜索距离添加为Store类的变量(这对我来说似乎很麻烦)来存储距离,然后是一个计算它并更新距离值并返回它的方法。
int CalcDistance(lat, long)
{
... do some calc...
this.CurrentSearchDistance = results;
return results;
}
...然后
return context.Stores.Where(store => store.CalcDistance(lat,long) < searchArea);
答案 1 :(得分:0)
我是在ADO.NET数据服务论坛下发布的,并从MS成员那里得到了一些非常有用的反馈。
我最后只是在我的表中添加了另一个物理列并使用了一个存储过程,但是目前这个问题看起来并不是很好的解决方案,因为在SP结果上使用AsQueryable会给我一个EnumerableQuery ,而不是ObjectQuery,所以像$ expand这样的运算符不起作用。
哦,我想我不会在这个阶段使用Astoria而不仅仅是原型,但看起来它在将来的版本中会有所改进。