2013-04-14 2 views
6

Dans ma base de données j'ai définir certaines fonctions, disons fnTest. Est-il possible d'appeler cette fonction à partir de ma requête LINQ/EF? Quelque chose comme ceci:Comment appeler la fonction DB à partir de la requête EF LINQ?

var param3, param4; 
var res = (from x in db.Something 
      where x.field1 > 0 
      orderby fnTest(x.f1, x.f2, param3, param4) 
      select x).Take(20); 

Comme vous pouvez le voir, j'ai besoin de cette fonction pour exécuter sur le côté DB parce que je dois trier les données en utilisant la valeur qu'elle retourne. Les deux premiers paramètres sont des champs de la table, et les deuxièmes paramètres sont des nombres qui vont changer dans le programme, mais seront constants pour chaque requête.

Est-il possible d'appeler en quelque sorte une fonction déjà créée dans le DB? Ou dois-je utiliser quelque chose comme ceci:

((IObjectContextAdapter) context).ObjectContext.CreateQuery 

et d'écrire la requête manuellement?

Répondre

6

Tout d'abord, fnTest devra être créé en fonction définie par l'utilisateur dans la première base de données:

CREATE FUNCTION [fnTest] (@fi int, @f2 int, @param3 int, @param4 int) 
RETURNS int 
AS ... 

ensuite dans votre fichier .edmx, déclarer la fonction comme celui-ci :

<Function Name="fnTest" ReturnType="int" Schema="dbo" > 
    <Parameter Name="f1" Mode="In" Type="int" /> 
    <Parameter Name="f2" Mode="In" Type="int" /> 
    <Parameter Name="param3" Mode="In" Type="int" /> 
    <Parameter Name="param4" Mode="In" Type="int" /> 
</Function> 

maintenant, vous pouvez lier cette fonction à une méthode dans votre modèle comme celui-ci:

[EdmFunction("MyNamespace", "fnTest")] 
public static int fnTest(int f1, int f2, int param3, int param4) 
{ 
    throw new NotSupportedException("Direct calls are not supported."); 
} 

Vous pouvez maintenant utiliser cette méthode dans les requêtes LINQ standard.

Lectures

+0

, c'est exactement ce que je voulais! – xx77aBs

Questions connexes