2016-07-12 11 views
0

Ok, so muss ich ein Dictionary aus den Ergebnissen einer Linq-Abfrage erstellen/zurückgeben. Ich habe fast alles versucht, was mir einfällt, und habe immer wieder Probleme. Hier ist, was ich gerade versuche ...C# Linq Abfrage zurückgeben Wörterbuch <int,int[]>

public static Dictionary<int,int[]> GetEntityAuthorizations(int userId) 
    { 
     using (MyDb db = new MyDb()) 
     { 
      var query = db.EntityManagerRoleAssignments.Where(x => x.EntityManager.ManagerId == userId); 
      var entityId = query.Select(x => x.EntityManager.EntityId); 
      var roles = query.Select(x => x.RoleId).ToArray(); 
      var result = query.ToDictionary(entityId, roles); 
      return result; 
     } 
    } 

jede Hilfe würde sehr geschätzt werden. Was ich suche, um von diesem zurückgegeben zu werden, ist ein Dictionary, in dem der Schlüssel die entityId oder EntityManager.EntityId ist und die Werte ein Array von verbundenen RoleId's sind.

Derzeit bekomme ich die folgenden zwei Fehler zur Kompilierzeit, und andere Versuche waren Fehler ähnlich, aber nicht genau zu diesen.

Error 11 Die Typargumente für die Methode ‚System.Linq.Enumerable.ToDictionary < TSource, TKey> (System.Collections.Generic.IEnumerable, System.Func < TSource, TKey>, System.Collections.Generic. IEqualityComparer < TKey>) 'kann nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

Fehler 12 kann nicht implizit konvertiert Typ 'System.Collections.Generic.Dictionary < TKey, Sqor.Database.DbEntityManagerRoleAssignment>' auf 'System.Collections.Generic.Dictionary < int, int []>'

UPDATE - Arbeitslösung (Danke Stanley @D)

public static Dictionary<int,int[]> GetEntityAuthorizations(int userId) 
    { 
     using (SqorDb db = new SqorDb()) 
     { 
      var query = db.EntityManagerRoleAssignments.Where(x => x.EntityManager.ManagerId == userId); 
      var entityGroups = query.GroupBy(x => x.EntityManager.EntityId); 
      var result = entityGroups.ToDictionary(e => e.Key, 
                g => g.Select(x => x.RoleId).ToArray() 
               ); 
      return result; 
     } 
    } 
+1

Was macht es im Vergleich zu dem, was Sie tun wollen? – Adam

+5

Warum möchten Sie ein Wörterbuch mit einem einzigen Paar? Die Methode verwendet eine einzelne Benutzer-ID, sodass dieses Wörterbuch nicht mehr als ein Schlüsselwertpaar enthält. Lassen Sie es ein 'int []' zurückgeben. –

+0

Ihr Recht, ich habe meinen Code bearbeitet, um besser anzuzeigen, was ich ... – haltandcode

Antwort

1

Es klingt wie Sie durch die Entity ID gruppieren möchten und projizieren die Rolle zugeordnet IDs auf ein Array:

using (MyDb db = new MyDb()) 
{ 
    var query = db.EntityManagerRoleAssignments.Where(x => x.EntityManager.ManagerId == userId); 
    var entityGroups = query.GroupBy(x => x.EntityManager.EntityId); 
    var result = entityGroups.ToDictionary(e => e.Key, 
              g => g.Select(x => x.RoleId).ToArray() 
             ); 
    return result; 
} 
+0

Ich versuche es. Danke D Stanley. – haltandcode

+0

Ich denke, das funktioniert perfekt D Stanley, beim ersten Lauf erschien es 3 Einträge, von denen die erste richtig ist, mit den zweiten beiden ist 0,0. Nach dem Codeblock hatte GetEntityAuthorizations jedoch nur einen Satz, der korrekt wäre. – haltandcode

+0

Froh, es hat funktioniert. Das Debuggen von Linq-Abfragen durch deren Überprüfung kann schwierig sein. Normalerweise müssen Sie sich die Endergebnisse anschauen und dann versuchen, die Zwischenergebnisse zu überprüfen. –