2009-11-20 104 views
0

试图找出完成此操作的最佳方法。所以,我有商店与性能表:使用ADO.NET数据服务返回实体+额外数据

STOREID,名称,经纬度等

我使用ADO.NET数据服务(道夫)来创建一个Web服务,将显示附近的商店给定半径和坐标。我做了一个服务操作来获取参数并将结果作为IQueryable返回。到现在为止还挺好。

所以现在我有这样的事情:

return context.Stores.Where(...distance calculation...); 

这个伟大的工程,但我也想从给定的半径返回每个店的距离。我已经计算过了,但我应该如何将距离和商店数据一起包括在内?我是否应该使用Store和距离的属性来创建类似StoreSearchResult的类?

如果我只是使用SQL,我可以编写一个数据库查询,它将返回Store的所有数据以及距离列。喜欢的东西:

Select StoreID, Name, Latitude, Longitude, (calculation...) as Distance 
from Store 
where ...distance param... 

所以我在寻找发回原来的存储数据+距离计算,同时还返回IQueryable的最好的方式。我宁愿不采取IEnumerable并使用AsQueryable ...我只是觉得应该可以保持它“关闭”数据库查询,并且我可能只是缺少一些东西。

回答

0

我张贴这下ADO.NET数据服务论坛,并得到了来自MS成员,这是非常有用的一些反馈。

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/77769bd8-8955-4bad-997d-b13e1e691a21

彼时我刚刚加入到我的表中的另一个物理列,并使用一个存储过程,但它看起来并不像有真的在此刻很好地解决了这个问题,因为使用AsQueryable已在SP结果给我一个EnumerableQuery,而不是ObjectQuery,所以像$ expand这样的运算符不起作用。

哦,我想我不会使用道夫比在现阶段只是原型得多,但它看起来像它会在未来的版本中加以改进。

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; 

或者,你可以只添加当前搜索距离为在存储类变量列表(这对我来说似乎很混乱)来存储距离,然后计算它并更新距离值并返回它的方法。

int CalcDistance(lat, long) 
{ 
    ... do some calc... 
    this.CurrentSearchDistance = results; 
    return results; 
} 

然后...

return context.Stores.Where(store => store.CalcDistance(lat,long) < searchArea); 
+0

感谢您的回复!你的第一个答案类似于我已经熟悉的东西,但它只让我到IEnumerable,它不支持与IQueryable相同的东西。我可以使用AsQueryable,但它不像找到返回单个db语句的方法那么扎实。 – 2009-11-21 00:04:03