4 Stimmen

Foreach-Schleifenproblem für IQueryable-Objekt

Können wir die foreach-Schleife für IQueryable Objekt?

Ich würde gerne Folgendes tun:

query = IQueryable<Myclass> = objDataContext.Myclass; // objDataContext is an object of LINQ datacontext class

int[] arr1 = new int[] { 3, 4, 5 };

foreach (int i in arr1)
{
     query = query.Where(q => (q.f_id1 == i || q.f_id2 == i || q.f_id3 == i));
}

Ich erhalte eine falsche Ausgabe, da jeder Zeitwert von i geändert wird.

3 Stimmen

Welcher "Output"? Hier wird nichts ausgegeben...

4voto

fyjham Punkte 6924

Das Problem, das Sie konfrontiert sind, ist die verzögerte Ausführung, sollten Sie in der Lage sein, eine Menge von Informationen über diese zu finden, aber im Grunde keine der Code s ausgeführt werden, bis Sie tatsächlich versuchen, Daten aus der IQueryable zu lesen (konvertieren Sie es in eine IEnumerable oder eine Liste oder andere ähnliche Operationen). Dies bedeutet, dass dies alles geschieht, nachdem die foreach beendet ist, wenn i auf den endgültigen Wert gesetzt ist.

Wenn ich mich richtig erinnere, können Sie eine neue Variable innerhalb der for-Schleife wie folgt initialisieren:

foreach (int i in arr1)
{
   int tmp = i;
   query = query.Where(q => (q.f_id1 == tmp || q.f_id2 == tmp || q.f_id3 == tmp));
}

Durch die Aufnahme in eine neue Variable, die in jeder Schleife neu erstellt wird, sollte die Variable nicht geändert werden, bevor Sie die IQueryable .

1voto

alejandrobog Punkte 2071

Sie brauchen kein "für jeden", versuchen Sie es so:

query = objDataContext.Myclass.Where(q => (arr1.Contains(q.f_id1) || arr1.Contains(q.f_id2) || arr1.Contains(q.f_id3));

0voto

Oscar Cabrero Punkte 4170

Dies ist darauf zurückzuführen, dass " i "wird nicht ausgewertet, bis Sie die Abfragesammlung wirklich verwenden, wenn nicht zu diesem Zeitpunkt, glaube ich, " i " wird die letzte sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X