2016-05-26 11 views
-1

Bei der Verwendung von AWS DynamoDB "Object Persistence Model" in C# kam es zu einem interessanten Problem; Parsen der Ergebnisse einer Scan-Operation. Im folgenden Code sind meine Einträge in Datastore.userIndicators (ein Dictionary mit Objektlisten, die mit Benutzernamen indiziert sind) immer leere Listen.Warum findet IEnumerable.Where() meine Objekte in DynamoDBContext.Scan() Ergebnissen nicht?

var allIndicators = context.Scan<Indicator>(); 

Datastore.globalIndicators = allIndicators.Where(i => i.UserName == "*").ToList(); 
var userDefinedIndicators = allIndicators.Where(i => i.UserName != "*"); 

foreach (var username in userDefinedIndicators.Select(i => i.UserName).Distinct()) 
{ 
    Datastore.userIndicators[username] = userDefinedIndicators.Where(i => i.DynamoDbRangeKey.StartsWith(username)).ToList(); 
} 

So zum Beispiel, wenn ich Einträge in meinem Tisch habe, die ein Attribut „username“ mit dem Wert „userA“ enthalten, wenn Sie diesen Code läuft die Dictionary „Datastore.userIndicators“ wird mit einem Eintrag am Ende für Schlüssel "userA" aber der entsprechende Wert wird eine leere Liste sein.

Antwort

1

Nachdem mit diesem Hantieren und eine Ahnung folgenden, modifizierte ich die Zuweisung von

var allIndicators = context.Scan<Indicator>(); 

zu

var allIndicators = context.Scan<Indicator>().ToList(); 

Voila!

Es stellt sich heraus (wie durch AWS SDK documentation bestätigt), die Rückkehr der DynamoDBContext.Scan() Methode ist lazy-geladen. Aufruf von .ToList() erzwingt Aufzählung und lädt alle Ergebnisse.