2017-12-31 21 views
1

Ich versuche, meine Aktivitäten basierend auf Benutzerrollen zu filtern. Der Manager darf nur die Aktivitäten sehen, die die Rolle Manager enthalten. Siehe unten für weitere Informationen.RavenDb 4: Überprüfen, ob eine Zeichenfolge aus einem Array von Zeichenfolgen in einem anderen Array von Zeichenfolgen vorhanden ist

Daten:

var user = new User 
{ 
    Roles = [ 
     "Manager" 
    ] 
} 

var activities = new List<Activity> 
{ 
    new Activity 
    { 
     Description = "My First Activity", 
     Roles = [ 
      "Admin", 
      "Manager" 
     ] 
    }, 
    new Activity 
    { 
     Description = "My Second Activity", 
     Roles = [ 
      "Admin" 
     ] 
    }, 
    new Activity 
    { 
     Description = "My Third Activity", 
     Roles = [ 
      "Manager", 
      "Client" 
     ] 
    }, 
} 

Abfrage, die die Aktivität filtert

var filtered = await context.Query<Activity>() 
        .Where(x => x.Roles.Any(y => user.Roles.Contains(y))) 
        .ToListAsync(); 

Erwartetes Ergebnis der gefilterten:

[ 
    { 
     new Activity 
     { 
      Description = "My First Activity", 
      Roles = [ 
       "Admin", 
       "Manager" 
      ] 
     } 
     new Activity 
     { 
      Description = "My Third Activity", 
      Roles = [ 
       "Manager", 
       "Client" 
      ] 
     }, 
    } 
] 

Fehler von Abfrage

System.InvalidOperationException : Can't extract value from expression of type: Parameter 

Ich bekomme einen Fehler, also mache ich offensichtlich etwas falsch. Ist das der richtige Weg oder gibt es etwas Besseres?

Antwort

2

Diese RavenDB Berechnung während Abfrage zu tun erfordert, versuchen Sie dies, statt:

.Where(x => x.Roles.In(user.Roles)) (müssen möglicherweise eine using-Anweisung für die In Erweiterung Methode hinzufügen, Raven.Client.Linq, IIRC).

+0

Arbeitete wie ein Charme. Vielen Dank! –

Verwandte Themen