使用ADO.NET数据服务返回实体+额外数据

时间:2009-11-20 22:46:04

标签: .net linq entity-framework wcf-data-services

试图找出实现这一目标的最佳方法。所以我有一个带有属性的商店表:

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 ...我觉得应该可以让它“接近”数据库查询,我可能只是遗漏了一些东西。

2 个答案:

答案 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成员那里得到了一些非常有用的反馈。

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

我最后只是在我的表中添加了另一个物理列并使用了一个存储过程,但是目前这个问题看起来并不是很好的解决方案,因为在SP结果上使用AsQueryable会给我一个EnumerableQuery ,而不是ObjectQuery,所以像$ expand这样的运算符不起作用。

哦,我想我不会在这个阶段使用Astoria而不仅仅是原型,但看起来它在将来的版本中会有所改进。