Cela serait trivial avec une fonction scalaire (UDF) plutôt qu'avec un SP. Cependant, cela devrait fonctionner assez facilement - bien que si le SP est complexe (ie FMT_ONLY ne peut pas l'inspecter à 100%) alors vous devrez peut-être "l'aider" ...
Voici un dbml que j'ai généré à partir d'un simplfied SP qui renvoie un entier; vous pouvez modifier le dbml via « ouvrir avec ... éditeur xml).
<Function Name="dbo.foo" Method="foo">
<Parameter Name="inc" Type="System.Int32" DbType="Int" />
<Parameter Name="dataset" Type="System.String" DbType="VarChar(20)" />
<Return Type="System.Int32" />
</Function>
(notez que vous devez évidemment modifier les noms et les données-types)
Et voici le produit C#:
.
[Function(Name="dbo.foo")]
public int foo([Parameter(DbType="Int")] System.Nullable<int> inc, [Parameter(DbType="VarChar(20)")] string dataset)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
return ((int)(result.ReturnValue));
}
Si votre utilise le courant SP SELECT (au lieu de RETURN), le DBML devra refléter cela, vous pouvez résoudre ce problème en se cachant les détails de mise en œuvre et la fourniture d'une enveloppe publique dans une classe partielle, par exemple:
<Function Name="dbo.foo" Method="FooPrivate" AccessModifier="Private">
<Parameter Name="inc" Type="System.Int32" DbType="Int" />
<Parameter Name="dataset" Type="System.String" DbType="VarChar(20)" />
<ElementType Name="fooResult" AccessModifier="Internal">
<Column Name="value" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
</ElementType>
</Function>
Ce qui précède décrit un SP qui retourne une seule table avec une seule colonne; mais je l'ai fait le SP « privé » aux données contexte, et le type de résultat « interne » à l'assemblée (cacher):
[Function(Name="dbo.foo")]
private ISingleResult<fooResult> FooPrivate(
[Parameter(DbType="Int")] System.Nullable<int> inc,
[Parameter(DbType="VarChar(20)")] string dataset)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
return ((ISingleResult<fooResult>)(result.ReturnValue));
}
Maintenant dans mon propre fichier de classe je peux ajouter une nouvelle classe partielle (un nouveau fichier .cs) dans l'espace de noms correct, qui expose la méthode plus pratique:
namespace MyNamespace {
partial class MyDataContext
{
public int Foo(int? inc, string dataSet)
{
return FooPrivate(inc, dataSet).Single().value;
}
}
}
(l'espace de noms et les noms de contexte doivent être les mêmes que les données contexte réel). Cela ajoute une méthode publique qui cache les détails grungy de l'appelant.
Ne pas modifier le fichier designer.cs directement; vos changements seront perdus. Éditez seulement les classes dbml ou partielles.
Exactement ce que je cherchais. Merci. – driis
@driss - si vous rencontrez des problèmes avec SELECT, faites le moi savoir –
J'ai déjà utilisé la même technique dans mon projet. Cela fonctionne très bien .. Jusqu'à ce que vous modifiez votre DBML dans l'éditeur en quelque sorte. Tous vos changements seront écrasés. J'avais l'habitude de garder un fichier xml séparé chaque fois que je faisais des modifications manuelles, mais j'espère qu'il y a un meilleur moyen de quelque façon. –