C # Silverlight avec Entity Framework - Modifier le type de retour sur EntityQuery généré automatiquement?

c# entity-framework ienumerable silverlight

Question

Contexte

Actuellement, j'ai une application métier C # Silverlight qui utilise les services RIA. L'application est hébergée dans ASP.NET à l'aide de ADO.NET Entity Framework et d'une classe de service de domaine pour lire et écrire dans la base de données SQL Server.

Scénario

J'ai une méthode côté serveur dans DomainServiceClass qui renvoie une liste d'objets IEnumerable. Dans mon fichier ApplicationName.Web.g.cs, j'ai aussi une fonction générée automatiquement. Dans mon application client Silverlight, je souhaite pouvoir exécuter une boucle foreach sur la liste d'objets renvoyée.

Méthode DomainServiceClass:

    public IEnumerable<Image> GetJobImages(string jobGuid)
    {
        var query =
            (
             from j in Context.Job
             orderby (j.ShortCode)
             where j.JobID.Equals(jobGuid)
             join a in Context.Audit //.Distinct()
             on j.JobID equals a.Job.JobID
             join i in Context.Image
             on a.Image.JobID equals i.JobID

             select new Image
             {
                 HighResUrl = i.HighResUrl,
                 LowResUrl = i.LowResUrl,
                 UploadDate = i.UploadDate
                 }).AsEnumerable();

        return query;
    }

ApplicationName.Web.g.cs Fonction générée automatiquement:

    /// <summary>
    /// Returns an EntityQuery for query operation 'GetJobImages'.
    /// </summary>
    public EntityQuery<Image> GetJobImagesQuery(string jobGuid)
    {
        Dictionary<string, object> parameters = new Dictionary<string, object>();
        parameters.Add("jobGuid", jobGuid);
        return base.CreateQuery<Image>("GetJobImages", parameters, false, true);
    }

Code d'invitation du client Silverlight:

var context = dds.DomainContext as InmZenDomainContext;
                foreach(var item in context.GetJobImagesQuery(currentJob.JobID.ToString())
                {
                   item.etc.....//
                }

Problème

Malheureusement, lorsque j'essaie d'invoquer cette méthode comme ci-dessus, le message d'erreur suivant s'affiche:

"Impossible de convertir implicitement le type System.Windows.Ria.Data.EntityQuery en System.Collections.IEnumerable".

OU

'Ne contient pas de définition publique de GetEnumerator'.

Après avoir lu et parlé à d’autres personnes, j’ai été informé que je devais modifier le type de déclaration dans la fonction générée automatiquement (je pense).

Question

Est-ce que quelqu'un connaît un moyen de changer le type de retour en IEnumerable sur cette EntityQuery générée automatiquement?! - Ou d'une autre manière pour résoudre ce problème?

A tenté ce qui suit:

    /// <summary>
    /// Returns an EntityQuery for query operation 'GetJobImages'.
    /// </summary>
    public IEnumerable<Image> GetJobImagesQuery(string jobGuid)
    {
        Dictionary<string, object> parameters = new Dictionary<string, object>();
        parameters.Add("jobGuid", jobGuid);
        return base.CreateQuery<Image>("GetJobImages", parameters, false, true);
    }

(Cela échoue car la méthode est générée automatiquement, elle revient à ce qu'elle était quand je construisais la solution.)

Aide grandement appréciée.

Réponse acceptée

Le problème est qu'il vous manque une étape entre votre appel et la collection IEnumerable.

Vous devez exécuter EntityQuery et utiliser LoadOperation pour obtenir vos résultats. Ce n'est pas aussi simple qu'on pourrait le penser, et voici un bon post de forum qui donne un exemple de la façon de gérer les choses:

Comment obtenir une liste <> à partir de LoadOperation

Voici la ligne pertinente de l'exemple:

EntityQuery query = Context.GetEmployeesQuery();

Context.Load<Employee>(query).Completed += (sender, args) => {
    List<Employee> list = ((LoadOperation<Employee>)sender).Entities.ToList();
};

Réponse populaire

Vous devez charger la requête et obtenir les résultats de l'opération de chargement. Votre code d’invocation de client Silverlight doit être modifié comme suit:

var context = dds.DomainContext as InmZenDomainContext;
var loadOperation = context.Load(context.GetJobImagesQuery(currentJob.JobID.ToString()));
loadOperation.Completed += (sender, e) => {
  if (!loadOperation.HasError)
    foreach (var item in loadOperation.Entities)
      // Loop over returned items ... Or use LINQ on loadOperation.Entities.
  else
    // loadOperation.Error has details about the error.
    ...
}

Notez que tous les "appels réseau" sont asynchrones dans Silverlight.

Je suggérerais également que vous envisagiez de changer le paramètre de requête d'une chaîne en un GUID.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow