4

Je tente de créer un service de données ADO.NET avec beaucoup d'entités et quelques opérations de service. D'un côté, j'ai créé une application Web ASP.NET, dans laquelle se trouvent un modèle de données d'entité ADO.NET et un service de données ADO.NET. De l'autre côté j'ai créé une deuxième application Web ASP.NET qui a une référence de service au service de données.Utilisation des opérations de service d'un service de données ADO.NET à partir d'un client .NET

Les entités sont à venir à travers très bien, je peux utiliser LINQ pour récupérer les données que je veux:

TestEntities entities = new TestEntities(
      new Uri("http://localhost/service/service.svc")); 

var query = from customer in entities.Customers 
        where customer.ID == 1234 
        select customer; 

query.ToList(); 

Cela fonctionne. Cependant, récupérer des informations via Service Operations me échappe complètement. code côté Data Service:

public static void InitializeService(IDataServiceConfiguration config) { 
    config.SetEntitySetAccessRule("*", EntitySetRights.All); 
    config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); 
} 

[WebInvoke] 
public IQueryable<Customer> GetSomeCustomers() { 
    TestEntities entities = new TestEntities(); 
    return from customer in entities.Customers 
     where customer.ID > 0 && customer.ID < 20 
     select customer; 
} 

Quand j'ai ajouté la référence du service à mon projet client, Visual Studio ne capte pas sur toutes les opérations de service. Je sais que je peux y accéder via les URI construites et la méthode BeginExecute de l'objet DataServiceContext ou de l'objet TestEntities (dans ce cas), ou quelque chose comme ça, mais ce n'est pas comme cela que je le veux. Ce que je veux, c'est utiliser LINQ pour parcourir les données renvoyées de l'opération de service. Est-ce possible? Ça devrait l'être, non?

Répondre

5

Des choses simples une fois que vous le savez.

Juste quelques choses à savoir:

Actuellement DataServiceClientGenerator (qui utilise le EntityClassGenerator) ne marche pas créer des méthodes pour les opérations de service. L'utilisation de la méthode CreateQuery sur le contexte n'est pas supportée pour les opérations de service, actuellement elles fonctionnent car il n'y a pas de validation du côté client pour cela (vous remarquerez que si vous utilisez CreateQuery, le "()" est ajouté à la fin de la méthode requête comme ceci « http://localhost/service.svc/method()?parameter=2 », vous pouvez utiliser CreateQuery mais il est pas recommandé.

renvoient des valeurs, mais pour cet exemple toutes les opérations de service Je ne montrer un exemple pour ceux qui le font.

public partial class NorthwindEntities 
{ 
    public IQueryable<Order> OrdersByRegion(int regionId) 
    { 
    return this.Execute<Orders>(new Uri(string.Format("{0}OrdersByCountry?regionId={1}", this.BaseUri, regionId), UriKind.RelativeOrAbsolute)); 
    } 
} 

Si vous avez besoin de plus d'informations, n'hésitez pas à poser vos questions. PS: Sur votre exemple vous n'avez pas besoin de créer un nouveau contexte de données sur votre opération de service (côté serveur) le DataService a déjà une référence instanciée lorsque le service est appelé.

Vous pouvez réellement remplacer le créer du contexte de données sur le côté service comme celui-ci:

protected override NorthwindEntities CreateDataSource() 
{ 
    return new NorthwindEntities(); 
} 
+0

Ok, mais comment voulez-vous invoquer l'opération « OrdersByRegion » du côté client? Devez-vous créer l'URL REST (par exemple http: //server/service.svc/OrdersByRegion? RegionId = 1) à la main? Merci. –

+1

Salut Ciprian, oui, malheureusement, vous le faites. string.format est généralement le meilleur à utiliser. voir mon premier exemple de code il montre comment l'appeler – dmportella

+0

Désolé, j'ai oublié de marquer cela comme la réponse acceptée (je parcourais mes questions), j'étais un peu frustré à ce moment que les URL ne seraient pas construites automatiquement. Merci. – pancake

Questions connexes