2012-04-11 19 views
1

Es scheint, ich bin nicht in der Lage, eine Where-Klausel auf das Include in meinem Domain-Service zu setzen - also machen wir einige Schleifen, um die Daten, die wir für einige LookupGroups benötigen.Lazy loading Navigationseigenschaften

Der Counter, den ich einsetzte, war für eine Bestätigung, was ich sah - die erste Gruppe, die wir durchlaufen, ist States. Mein Counter wird sagen 50, aber meine Navigationseigenschaft wird sagen 100, zeigt einen Satz von 50 für jede Institution, die wir haben (wir haben 2 Sätze). Also wird es gehen und alle Lookupvalues ​​bekommen und sie in die Navigationseigenschaft setzen, obwohl mein Counter 50 sagt. Außerdem habe ich alle Includes in der Metadatendatei entfernt.

Um zu verdeutlichen: Ich habe Lookupvalues, die an LookupGroups angehängt sind. Die Lookup-Werte werden Institutionen zugeordnet. Wenn ich also die Werte für die Lookup-Gruppe von STATES erhalte, würde ich 50 Lookup-Werte erhalten. der Code oben. Wenn ich diese Zeile ausführen _group.InstitutionLookupValues.Add (_value); meine InstitutionsLookupValues ​​= 100 (alle LookupValues ​​unabhängig von der Institution). aber mein Zähler zeigt 50. irgendwo bekomme ich alle Nachschlagewerte nicht sicher die an eine bestimmte Institution gebunden sind.

+3

Ich verstehe nicht, was das Problem ist. Was ist dein Schalter? Ist es ein Problem mit den verschiedenen Zahlen? –

+0

danke - habe die Frage ein wenig aktualisiert. – gevjen

Antwort

3

Ich denke, dass dies durch die Tatsache verursacht wird, dass Sie auf eine modifizierte Schließung zugreifen, und, selbst wenn es nicht ist, sollten Sie nicht sowieso sein. Die Linie

wahrscheinlich nicht tun, was Sie denken, es tut (es sei denn, es ist C# 5). Das Lambda ist ein Delegat und der Abschluss schließt über die Variable, nicht den Wert. Das bedeutet, dass Ihr Code _group.LookupGroupID immer der letzte Wert aus der letzten Iteration des Enumerators ist. Daher filtern Sie die Nachschlagewerte nur nach einer _group.LookupGroupID.

Versuchen Sie, den Block zu ändern:

foreach (var _group in _lookupGroups) 
{ 
    var currentGroup = _group;  
    var _values = _lookupValues.Where(x => x.LookupGroupID == currentGroup.LookupGroupID); 

    foreach (var _value in _values) 
    { 
    currentGroup.InstitutionLookupValues.Add(_value); 

    i++; 
    } 

    Console.WriteLine(currentGroup.GroupName + " " + i.ToString()); 
} 

Ich bin mir nicht sicher, ob das die Ursache für das Problem ist, aber Sie werden andere seltsame Effekte sowieso bekommen. Indem Sie Ihre eigene Variable in der Schleife erstellen, vermeiden Sie das Schließen der generierten Enumeratorvariablen.

Werfen Sie einen Blick auf Eric Lipperts Artikel dazu: Closing over the loop variable considered harmful. Es ist überraschend, wie wenige Menschen sich dieses Problems bewusst sind.

Außerdem ist es wahrscheinlich eine gute Idee, um die Abfrage zu kollabieren:

var _lookupValues = _institutionLookupValueRepository.All().Where(x => x.InstitutionID == _userProfile.InstitutionID); 

von ToList() oder einem ähnlichen Gegenstand. Andernfalls werten Sie diese Abfrage für jede Schleife in _lookupGroups erneut aus. Dies könnte ein unangenehmer Leistungseinbruch sein, wenn die Abfrage entweder in einer Datenbank erfolgt oder die Schleife groß ist.

+1

+1: Tolle Analyse! – Slauma

+0

Das ist eine großartige Analyse - Danke - ich werde das ausprobieren und Ihnen Bericht erstatten, danke. – gevjen

+0

Immer noch die gleichen Ergebnisse mit dieser Codeänderung - ich sehe 100 Zustände in dieser Navigationseigenschaft, wenn es fertig ist, durch die erste LookupGroup zu gehen. – gevjen