C # Silverlight mit Entity Framework - Rückgabetyp bei automatisch generierter EntityQuery ändern

c# entity-framework ienumerable silverlight

Frage

Hintergrund

Derzeit habe ich eine C # Silverlight-Geschäftsanwendung, die RIA-Services verwendet. Die Anwendung wird in ASP.NET mit ADO.NET Entity Framework und einer Domänendienstklasse zum Lesen und Schreiben in die SQL Server-Datenbank gehostet.

Szenario

Ich habe eine serverseitige Methode in meiner DomainServiceClass, die eine IEnumerable-Liste von Objekten zurückgibt. In meiner ApplicationName.Web.g.cs-Datei habe ich auch eine automatisch generierte Funktion. In meiner Silverlight-Clientanwendung möchte ich eine foreach-Schleife über die zurückgegebene Liste von Objekten ausführen können.

DomainServiceClass-Methode:

    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-Funktion:

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

Silverlight-Client-Aufrufcode:

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

Problem

Wenn ich diese Methode wie oben beschrieben versuche, erhalte ich entweder den Fehler:

"Der Typ System.Windows.Ria.Data.EntityQuery kann nicht implizit in System.Collections.IEnumerable konvertiert werden."

ODER

'Enthält keine öffentliche Definition für GetEnumerator'.

Nachdem ich gelesen und mit anderen gesprochen hatte, wurde mir mitgeteilt, dass ich den Rückgabetyp der AutoGenerated-Funktion ändern muss (denke ich).

Frage

Kennt jemand eine Möglichkeit, auf dieser AutoGenerated EntityQuery den Rückgabetyp in IEnumerable zu ändern ?! - Oder auf eine andere Art, dieses Problem zu lösen?

Folgendes versucht:

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

(Dies schlägt fehl, da die Methode automatisch generiert wird. Sie greift einfach zu dem zurück, was sie früher war, wenn ich die Lösung baue.)

Hilfe sehr geschätzt.

Akzeptierte Antwort

Das Problem ist, dass Sie einen Schritt zwischen Ihrem Aufruf und der IEnumerable-Auflistung verpassen.

Sie müssen die EntityQuery ausführen und LoadOperation verwenden, um Ihre Ergebnisse zu erhalten. Es ist nicht so einfach, wie Sie denken, und hier ist ein guter Forumbeitrag, der ein Beispiel für den Umgang mit Dingen enthält:

So erhalten Sie eine Liste <> von LoadOperation

Hier ist die relevante Zeile aus dem Beispiel:

EntityQuery query = Context.GetEmployeesQuery();

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

Beliebte Antwort

Sie müssen die Abfrage laden und die Ergebnisse des Ladevorgangs abrufen. Ihr Silverlight-Client-Aufrufcode sollte folgendermaßen geändert werden:

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

Beachten Sie, dass alle "Netzwerkaufrufe" in Silverlight asynchron sind.

Ich würde auch vorschlagen, dass Sie in Betracht ziehen, den Abfrageparameter von einer Zeichenfolge in eine GUID zu ändern.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum