2010-06-02 4 views

Répondre

4

Bien sûr. Supposons que vous ayez une fonction qui calcule la distance de Haversine entre deux positions (consistant en une coordonnée de latitude et de longitude). Si ce n'est pas le cas, vous pouvez en trouver un here. Ensuite, utilisez simplement la fonction en tant que sélecteur dans une clause Where. Si vous utilisez LINQ to SQL, vous devrez les matérialiser dans vos objets Position afin que vous puissiez utiliser la fonction Haversine sur eux en tant que LINQ to objects; il n'y a pas de traduction en SQL, bien que vous puissiez probablement créer une fonction table qui fasse la même chose si vous ne voulez pas retourner tous les points en premier.

var origin = new Position(47.6, 122.3); 
var close = positions.Where(p => Haversine.Distance(origin, p, DistanceType.Km) <= 35); 
+0

Je vais vous donner un coup de feu et vous le faire savoir. – Xaisoft

+0

Bonjour. Je l'ai en partie travailler, mais je suis un peu confus sur ce que vous voulez dire en les matérialisant à positionner des objets? Pouvez-vous m'aider avec ça. – Xaisoft

+0

@Xaisoft, parce que LINQ ne peut pas traduire l'appel à la fonction Haversine en SQL, il doit travailler avec eux en tant qu'objets. Cela signifie que, si vous obtenez les points d'une base de données, vous devez les récupérer en mémoire avant la clause Where. La méthode la plus simple consiste à insérer un objet ToList() dans la chaîne avant. Cela provoquera la matérialisation de la requête (exécutée et mise en mémoire) où vous pourrez travailler avec eux en tant qu'objets. (suite) – tvanfosson

Questions connexes