2009-11-20 97 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