2009-11-20 7 views
0

Essayez de trouver le meilleur moyen d'y parvenir. J'ai donc une table de magasins avec des propriétés:Retour d'entités + données supplémentaires avec les services de données ADO.NET

StoreID, Nom, Latitude, Longitude, etc.

Je l'aide des services de données ADO.NET (Astoria) pour créer un service Web qui montrera les magasins à proximité donné un rayon et une coordonnée. J'ai fait une opération de service pour prendre les paramètres et retourner les résultats comme un IQueryable. Jusqu'ici tout va bien.

Donc maintenant j'ai quelque chose comme:

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

Cela fonctionne très bien, mais je veux aussi revenir la distance de chaque magasin du rayon donné. J'ai le calcul couvert, mais comment dois-je inclure la distance avec les données du magasin? Dois-je créer une classe comme StoreSearchResult avec des propriétés pour le magasin et la distance? Si j'utilisais simplement SQL, je pourrais écrire une seule requête de base de données qui retournerait toutes les données pour le magasin, avec une colonne pour la distance. Quelque chose comme:

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

Je suis à la recherche de la meilleure façon de renvoyer les données du magasin d'origine + le calcul de la distance tout en retournant IQueryable. Je préférerais ne pas prendre un IEnumerable et utiliser AsQueryable ... J'ai juste l'impression qu'il devrait être possible de le garder proche de la requête de la base de données, et il me manque probablement quelque chose.

Répondre

0

J'ai posté ce sous le forum ADO.NET Data Services, et a obtenu des commentaires d'un membre MS qui était très utile.

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

Je blesse juste ajouter une autre colonne physique à ma table et en utilisant une procédure stockée, mais il ne ressemble pas il y a vraiment une bonne solution à ce problème pour le moment, parce que l'utilisation AsQueryable sur la Les résultats SP me donnent une EnumerableQuery, pas ObjectQuery, donc les opérateurs comme $ expand ne fonctionnent pas. Eh bien, je pense que je n'utiliserai pas Astoria pour beaucoup plus que le prototypage à ce stade, mais il semble que ce sera amélioré dans les futures versions.

0

Il peut être préférable d'écrire un struct qui tient magasin et la distance puis juste les ajouter à une liste des correspondances

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; 

Ou, vous pouvez simplement ajouter la distance de recherche actuelle comme une variable de la classe de magasin (ce qui me semble désordonné) pour stocker la distance, puis une méthode qui va le calculer et mettre à jour la valeur de la distance ainsi que le retourner.

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

puis ...

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

Merci pour la réponse! Votre première réponse est similaire à quelque chose que j'avais déjà préparé, mais cela ne m'amène qu'à IEnumerable, qui ne supporte pas les mêmes choses que IQueryable. Je pourrais utiliser AsQueryable, mais cela ne semble pas aussi solide que de trouver un moyen de renvoyer une seule instruction db. –

Questions connexes