2010-11-23 8 views
0

Une application Silverlight utilise les services WCF RIA pour se connecter à une base de données SQL Server. Avant d'insérer un tas de nouveaux enregistrements dans une table, je devrais vérifier si cette table contient des enregistrements avec une certaine valeur dans l'un des champs.Silverlight Services WCF RIA. Vérification du résultat d'une méthode booléenne

Ma méthode côté serveur dans la classe de service Domaine:

[Invoke] 
    public bool CheckRec(string nameFilter) 
    { 
     bool res = false; 
     if (this.ObjectContext.MyTest.FirstOrDefault(p => p.Name == nameFilter) != null) 
     { 
      res = true; 
     }    
     return res; 
    } 

Comment je pourrais vérifier le résultat de la méthode sur le client? Je suis en train de la manière comme ce qui suit, mais qui ont besoin d'aide pour mettre en œuvre cette correctement:

MyTestContext testcontext = new MyTestContext(); 
string tname = savetdlg.TNameTBox.Text; 
testcontext.CheckRec(tname).Completed += (df, fg) => 
       { 
        bool notunique = ?????? // how to get result of the method? 
        if (notunique == true) 
        { 
         //todo if record exists 
        } 
        else 
        { 
         //todo if record doesn't exist 
        }     
       }; 
+0

orthogonale, mais votre chèque pourrait être écrit comme renvoie this.ObjectContext.MyTest.Any (p => p.Name == nameFilter); –

+0

En fonction du contexte et de la raison de la vérification, vous pouvez également ajouter «if» au début de l'appel du serveur qui effectue les insertions. Bien sûr, si vous avez besoin de deux appels séparés (par exemple, le nombre d'enregistrements à télécharger/écrire est énorme et il est assez courant que vous n'ayez pas besoin de les écrire), alors ne vous inquiétez pas. :) –

+0

IMHO vous ne devriez pas utiliser ce genre d'accrochage à l'événement terminé (ou un type similaire d'événement) après le début de l'opération - si vous voulez définir la logique dans un lambda 'inline' de toute façon, il suffit d'appeler la surcharge qui vous permet de passer dans l'action > à la place, IMHO :) Hooking à 'terminé' après une opération a déjà commencé semble juste que vous ajoutez intentionnellement une condition de course quand il est assez simple à éviter, même si je J'admettrai que c'est une personne improbable à frapper. –

Répondre

2

Eh bien, fait de la manière suivante:

MyTestContext testcontext = new MyTestContext(); 
string tname = savetdlg.TNameTBox.Text; 

testcontext.CheckRec(tname, context_CheckRecCompleted, null); 

void context_CheckRecCompleted(InvokeOperation<bool> op) 
    { 
     bool notunique = op.Value; 
     if (notunique == true) 
     { 
      //todo if record exists 
     } 
     else 
     { 
      //todo if record doesn't exist 
     } 
    } 
+1

juste curieux, pourquoi passer le second param comme x => context_CheckRecCompleted (x) au lieu de simplement context_CheckRecCompleted? Pas que ça compte vraiment, juste curieux :) –

+0

@James Manning Oui, tu as raison. Corrigé le code. Merci! – rem