2010-08-09 7 views
1

est-il possible d'appeler la fonction Math.Sin() dans une Linq To Entites (Entity Framework 4) -Query?Entity Framework 4: Math.Sin() - fonction

J'ai lu que Entity Framework 4 n'implémente pas cette fonction.

Peut-être y a-t-il une solution de contournement pour résoudre ce problème?

(Je ne veux pas d'inviter toutes les entrées dans la mémoire.)

Merci et meilleures salutations

+1

Non près de ma machine de développement en ce moment, mais System.Data.Objects.SqlClient.SqlFunctions.Sin() doesn ' t travail? – tclem

+0

merci beaucoup! Ça marche! – Beni

+0

Pourriez-vous marquer l'une des réponses ci-dessous comme bonne réponse? –

Répondre

1

Plusieurs fonctions qui ont (généralement) des équivalences SQL évidentes, telles que Math.Sin, ne peuvent pas être utilisées directement dans les requêtes Entity Framework. Probablement parce qu'ils ne peuvent pas être traduits de manière fiable en différentes implémentations SQL. Une tonne de fonctions spécifiques à MSSQL sont cependant exposées en tant que méthodes statiques dans la classe System.Data.Objects.SqlClient.SqlFunctions. Ils lancent des exceptions si vous les appelez directement, mais sont traduites dans le bon SQL si elles sont utilisées dans une requête LINQ.

Voir this blog post sur la magie qui se passe sous les couvertures (à savoir l'attribut EdmFunction).

+0

Cool, je ne le savais pas. Il semble que ma réponse ne soit pas correcte. –

0

Malheureusement, il est impossible d'appeler Math.Sin dans une requête de LinqToEntities (ou Entité requête SQL). La seule façon d'accomplir cela sans avoir à récupérer tous les objets en premier est d'écrire une requête SQL qui fait ce que vous voulez et de l'appeler via ObjectContext.ExecuteStoreQuery. Ce n'est pas aussi mauvais que cela puisse paraître, car vous pouvez toujours get back typed results.


EDIT: Après avoir lu les autres réponses, il semble qu'il est possible d'appeler ces types de fonctions (SqlFunctions contient 44 fonctions avec différentes surcharges). Je laisse ma réponse originale telle quelle, car c'est une autre façon d'atteindre le même résultat.

0

Il est certainement possible d'utiliser une telle fonction en commençant par EF4. Dans EF4, l'équipe EF a introduit les fonctions SqlServer qui peuvent être consommées dans linq. Vous devriez toujours envisager d'utiliser des fonctions canoniques, car ils sont agnostiques de base de données et chaque fournisseur devrait convertir ces fonctions pour stocker l'équivalent spécifique. Toutefois, lorsque ces fonctions ne sont pas disponibles, vous pouvez avoir recours à l'espace de noms de SqlServer (ESQL) ou SqlFunctions pour LINQ

de l dans db.Locations sélectionner SqlServer.Sin (l.Latitude) + SqlServer.power (l.Longitutde)

Je couvre plusieurs de ces options dans le chapitre de mes fonctions de mon livre. Plus précisément, vous pouvez consulter la recette 11-10 Appel de la fonction de base de données dans esql 11-11 Appel de la fonction de base de données dans LINQ