C # Silverlight con Entity Framework - ¿Cambiar el tipo de retorno en EntityQuery generado automáticamente?

c# entity-framework ienumerable silverlight

Pregunta

Fondo

Actualmente tengo una aplicación de negocios C # Silverlight que utiliza los Servicios RIA. La aplicación está alojada en ASP.NET utilizando el Entity Framework de ADO.NET y una clase de servicio de dominio para leer y escribir en la base de datos de SQL Server.

Guión

Tengo un método del lado del servidor en mi DomainServiceClass que devuelve una lista de objetos IEnumerable. En mi archivo ApplicationName.Web.g.cs también tengo una función generada automáticamente. En mi aplicación Silverlight Client, quiero poder ejecutar un bucle foreach sobre la lista de objetos devueltos.

Método 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 AutoGenerated Function:

    /// <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);
    }

Código de Invocación del Cliente Silverlight:

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

Problema

Desafortunadamente, cuando intento invocar este método como se indica arriba, recibo el error:

'No se puede convertir implícitamente el tipo System.Windows.Ria.Data.EntityQuery a System.Collections.IEnumerable'.

O

'No contiene una definición pública para GetEnumerator'.

Después de leer y hablar con otros, me informaron que necesito cambiar el tipo de retorno en la función AutoGenerada (creo).

Pregunta

¿Alguien sabe de alguna manera en la que pueda cambiar el tipo de retorno a IEnumerable en esta EntityQuery AutoGenerada? - ¿O de una manera diferente en la que resolver este problema?

Intentó lo siguiente:

    /// <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);
    }

(Esto falla porque el método se genera automáticamente, simplemente vuelve a ser lo que solía ser cuando construí la solución).

Ayuda muy apreciada.

Respuesta aceptada

El problema es que le falta un paso entre su llamada y la colección IEnumerable.

Debe ejecutar EntityQuery y usar LoadOperation para obtener sus resultados. No es tan sencillo como parece, y aquí hay una buena publicación en el foro que tiene un ejemplo de cómo manejar las cosas:

Cómo obtener una lista <> de LoadOperation

Aquí está la línea relevante del ejemplo:

EntityQuery query = Context.GetEmployeesQuery();

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

Respuesta popular

Debe cargar la consulta y obtener los resultados de la operación de carga. El código de invocación de su cliente de Silverlight se debe modificar en algo como esto:

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.
    ...
}

Tenga en cuenta que todas las "llamadas de red" son asíncronas en Silverlight.

También sugeriría que considere cambiar el parámetro de consulta de una cadena a un GUID.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow