Announcement

Collapse
No announcement yet.

Das Ergebnis einer Abfrage kann nicht mehrmals aufgezählt werden?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Das Ergebnis einer Abfrage kann nicht mehrmals aufgezählt werden?

    Hallo,

    ich habe folgenden Fehler:
    Das Ergebnis einer Abfrage kann nicht mehrmals aufgezählt werden.
    Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.

    Ausnahmedetails: System.InvalidOperationException: Das Ergebnis einer Abfrage kann nicht mehrmals aufgezählt werden.
    Hier der gekürzte Code incl. markierter Fehlerstelle.

    Code:
    private void RefreshFrontiers(int X, int Y)
    {
    	TdDataContext Db = Td.Database.Connection;
    
    	var Fields = Db.GetFieldsInRangeWithSecondCoords(X, Y, 2);
    
    	foreach (Fields Field in GetFieldsInRange(Fields, X, Y, 1))
    	{
    		string NewFrontier = GetNewFrontier(Fields, Field.X2, Field.Y2);
    
    		[...]
    	}
    
    	//Db.SubmitChanges();
    }
    
    private IEnumerable<Fields> GetFieldsInRange(ISingleResult<Fields> Fields, int X, int Y, int Distance)
    {
    	return Fields.Where(f => (Math.Abs(X - f.X2) + Math.Abs(Y - f.Y2) + Math.Abs((X - f.X2) - (Y - f.Y2))) / 2 <= Distance);
    }
    
    private string GetNewFrontier(ISingleResult<Fields> Fields, int X, int Y)
    {
    	foreach (var Field in GetFieldsInRange(Fields, X, Y, 1)) // << hier ist der Fehler
    	{
    		[...]
    	}
    
    	string Result = "";
    
    	[...]
    
    	return Result;
    }
    Von der Logik her sagt mir der Fehler, dass ich über Fields kein 2. foreach Schleife laufen lassen kann? Doch wieso - ist das nicht schwachsinnig?

    Danke im voraus!

    Grüße,
    n26

  • #2
    Hallo,

    soweit ich das analysieren kann ist das Problem folgendermaßen:

    LINQ verwendet verzögerte Ausführung der Abfragen. D.h. die Daten werden erst dann von der Datenbank geholt wenn diese tatsächlich benötigt werden. Daher wird der Fehler geworfen da sich LINQ bzw. dessen Query-Engine nicht mehr auskennt - einfach gesagt.

    Abhilfe kann geschaffen werden wenn die Daten eben nicht verzögert geladen werden. Dies kann erreicht werden indem das Ergebnis der Abfrage zB in eine List<T> gespeichert wird, denn somit werden alle Daten sofort aus der DB geholt.

    Auf deinen Code angewendet heißt das zB
    [highlight=c#]
    var Fields = Db.GetFieldsInRangeWithSecondCoords(X, Y, 2).ToList();
    [/highlight]
    Selbiges für alle anderen Ergebnisse die mehrmals benötigt werden.

    Also wenn ich nichts übersehen habe sollte es so gehen

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Juhu danke, damit ist zumindest das Problem gelöst, auch wenn ich direkt auf das nächste Stoße.

      Durch das ToList() holt der logischer Weise nicht alle Daten die sonst wie Tief mit Freign Keys verbunden sind.

      Der geänderte Code:
      Code:
      private void RefreshFrontiers(int X, int Y)
      {
      	TdDataContext Db = Td.Database.Connection;
      
      	var Fields = Db.GetFieldsInRangeWithSecondCoords(X, Y, 2).ToList();
      
      	foreach (Fields Field in GetFieldsInRange(Fields, X, Y, 1))
      	{
      		string NewFrontier = GetNewFrontier(Fields, Field.X2, Field.Y2);
      
      		int R = Field.MapUser.Colors.R; 
      		[...]
      	}
      
      	//Db.SubmitChanges();
      }
      Bei int R = Field.MapUser.Colors.R; bekomme ich nun einen neuen Fehler, weil wie oben erwähnt, die Daten in der Tiefe nicht geholt werden.

      Zufällig noch eine Idee wie ich das elegant lösen könnte? Mir würde gerade nur einfallen, die Daten nochmals aus der DB zu holen - das würde ich aber gern vermeiden

      Danke,
      n26
      Attached Files
      Zuletzt editiert von n26; 24.11.2008, 22:49. Reason: ausversehen zu schnell abgesendet

      Comment


      • #4
        Kann schwer nachvollziehen was tatsächlich passiert da mir Info fehlen.

        Aber:
        Code:
        foreach (Fields Field in GetFieldsInRange(Fields, X, Y, 1).ToList())
        {
        ...
        }
        Da mir eben die Infos fehlen kann ich nicht sagen ob sich die Abfragen anders besser schreiben lassen.
        zB
        Code:
        var query = 
            from f in db.GetMyStoredProcedure
            where f.Id > 10
            select ....
        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Okay ich warte mal bis morgen da habe ich vllt wieder etwas mehr Denkleistung und finde eventuell eine Lösung mit dem umschreiben.

          Danke dir bis hierhin!

          Edit:
          Okay der Fehler bzw. das Problem was ich jetzt noch hatte lag nicht an der Arbeitsweise von Linq sondern an einem kleinen Denkfehler von mir. Ein "!=" mit einem "==" ausgetauscht und schon funktionirt es ( ;
          Zuletzt editiert von n26; 25.11.2008, 13:00. Reason: Neuigkeiten

          Comment

          Working...
          X