Frage

Okay Leute, ich bin ein Neuling in Data Services und LINQ dringend einige Hinweise. In nur wenigen Tagen habe ich zahlreiche unerwartete Hindernisse gestoßen und ich bin auf einem jetzt stecken. Ich hoffe, dies sind nur typische Frustrationen ein neues Instrument zu lernen.

ich einen WCF Data Service habe für Daten aus einer SQL Server-Datenbanktabelle von GPS-Koordinaten serviert. Insbesondere habe ich eine Dienstmethode, die Sie eine Dezimalgenauigkeit und Breiten- / Längenbereich, um eine allgemeinere Darstellung der Daten angeben kann.

In einem Web-Browser erscheint es nur funktionieren wie erwartet. Jedoch wenn ich versuche, den Betrieb von meinem Client-Anwendung aufrufen, wird die Liste der Client unterscheidet sich von der Liste, die durch den Dienst zurückgegeben.

werde ich ein Stück meines Code verwenden, um die Details zu erklären:

Data Service Operation:

    // This is my service operation that I need to call from my client app (see below). 
    // It should return an IEnumerable<Gps> (Gps is one of my Entity Model 
    // types) list of distinct GPS rounded to the number of decimal positions 
    // specified and within the range specified.
    [WebGet]
    public IEnumerable<Gps> GetGpsView(int decimalPlaces, decimal minLatitude, decimal minLongitude, decimal maxLatitude, decimal maxLongitude)
    {
        // I must first return a list of anonymous-type objects
        // because LINQ does not seem to allow me to construct my
        // Gps object within the query (one of those other issues
        // I had to tip-toe around).
        var list = (from g in this.CurrentDataSource.Gps
                    where g.Latitude >= minLatitude &&
                             g.Latitude <= maxLatitude &&
                             g.Longitude >= minLongitude &&
                             g.Longitude <= maxLongitude
                    select new
                    {
                        Id = 0,
                        Latitude = Math.Round(g.Latitude, decimalPlaces),
                        Longitude = Math.Round(g.Longitude, decimalPlaces)
                    }).Distinct().ToList();

        // Now that I have my results, I need to convert the items in the
        // list to my Gps entity object.
        IEnumerable<Gps> gpsList = list.ConvertAll<Gps>(item => new Gps
                            {
                                Id = item.Id,
                                Latitude = item.Latitude,
                                Longitude = item.Longitude
                            });

        return gpsList;
    }

Wenn ich das obige Verfahren debuggen (es auf Visual Studio der virtuellen Server ausgeführt wird), wenn sie von meiner Client-Anwendung aufgerufen, erscheint gpsList die richtigen Daten zu enthalten, kurz bevor an den Client zurück. Mit meinen Prüfparameter, erhalte ich eine Liste von 200 verschiedenen GPS sind Objekte, deren Werte auf die Dezimalstellen gerundet I angeben.

Sobald jedoch die Ergebnisse des Aufruf der Methode in meiner Client-Anwendung zurückgegeben werden, ich habe eine Liste von 200 GPS-Objekten, aber sie sind alle der gleiche Wert. Um genau zu sein, ist der duplizierten Wert der letzte Wert in meinem erwarteten Ergebnismenge. Ich bestätigte dies durch diesen Vorgang in einem Web-Browser aufrufen und die Ergebnisse sehen.

Client-Methode:

// Partial class extension of code auto-generated by service reference.
public partial class HsiSideBySideEntities
{
    public List<Gps> GetGpsView(int decimalPlaces, decimal minLatitude, decimal minLongitude, decimal maxLatitude, decimal maxLongitude)
    {
        this.IgnoreMissingProperties = true;

        // Format my relative URI string.
        string uri = string.Format("/GetGpsView?decimalPlaces={0}&minLatitude={1}M&minLongitude={2}M&maxLatitude={3}M&maxLongitude={4}M", decimalPlaces, minLatitude, minLongitude, maxLatitude, maxLongitude);

        // If I debug both client and service at the same time, when I step over this
        // line, it does reach my data service - and as I mentioned above, on the
        // service end it appears to generate the correct results.
        List<Gps> gpsList = this.Execute<Gps>(new Uri(uri, UriKind.Relative)).ToList();

        // However, the results are returned to the client code, my list contains
        // duplicates of the last expected record.
        return gpsList;
    }
}

Ich habe versucht, den „ToList ()“ zu entfernen Teil der „Execute ()“ Linie, aber wenn ich versuche, um die Ergebnismenge im Debugger anzuzeigen, zeigt es eine Ausnahme, die lautet: „Nur eine einzige Aufzählung wird unterstützt von diese IEnumerable. "

Soweit ich das beurteilen kann, ist mein Client-Code zunächst suspekt. alle anderen Test zeigt Immerhin, dass meine Daten Service-Betrieb produziert die gewünschten Ergebnisse.

Muss ich etwas anderes tun die IEnumerable Liste von Objekten aus dem Datendienst zu erhalten?

Ich verstehe, gibt es eine Create () Option, aber ich habe gelesen, dass Execute () ist der geeignetere Weg für dieses Szenario.

War es hilfreich?

Lösung

Es ist wahrscheinlich, weil dieser:

select new
{
    Id = 0,
    Latitude = Math.Round(g.Latitude, decimalPlaces),
    Longitude = Math.Round(g.Longitude, decimalPlaces)
}

Ich gehe davon aus, dass die Id-Eigenschaft der GPS-Einheit ist der Primärschlüssel. In Ihrem Beispiel setzen Sie die ID jedes zurück GPS auf Null. In der WCF Data Services-Client-Bibliothek, Organisationen mit dem gleichen Primärschlüssel werden als die gleiche Instanz behandeln sowohl für den Wandel Gründe verfolgt und damit Objektgraphen verhalten, wie Sie in einer objektorientierten, Referenz-nachverfolgt Umgebung wie .NET erwarten.

Wenn Sie aus irgendeinem Grund nicht die GPS-Einheiten eine eindeutige Kennung geben können, sollten Sie für den Primärschlüssel ein Guid verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top