2016-07-12 3 views
0

Итак, мне нужно создать/вернуть словарь из результатов Linq Query. Я пробовал все, что я могу придумать, и у меня все время возникают проблемы. Вот что я сейчас пытаюсь ...C# Linq запрос для возврата Словарь <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; 
     } 
    } 

всякая помощь вообще была бы весьма признательна. то, что я ищу, чтобы быть возвращенным из этого, является Словарем, где Ключ является объектом entityId или EntityManager.EntityId и Value (s) являются массивом связанных ролей.

В настоящее время во время компиляции я получаю следующие две ошибки, а в других попытках были ошибки, похожие, но не точные для них.

Error 11 Аргументы типа для метода «System.Linq.Enumerable.ToDictionary < TSource, TKey> (System.Collections.Generic.IEnumerable, System.Func < TSource, TKey>, System.Collections.Generic. IEqualityComparer < TKey>) 'не может быть выведен из использования. Попробуйте явно указать аргументы типа.

Ошибка 12 Не удается неявно преобразовать тип 'System.Collections.Generic.Dictionary < TKey, Sqor.Database.DbEntityManagerRoleAssignment>' на 'System.Collections.Generic.Dictionary < INT, INT []>'

ОБНОВЛЕНИЕ - Рабочий раствор (Благодаря @D Stanley)

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

Что он сейчас делает в сравнении с тем, что вы хотите? – Adam

+5

Почему вы хотите использовать словарь с одной парой? Метод принимает один идентификатор пользователя, поэтому этот словарь не будет содержать более одной ключевой пары. Пусть он возвращает 'int []'. –

+0

ваше право, я отредактировал свой код, чтобы лучше отобразить, что мне нужно ... – haltandcode

ответ

1

Это звучит, как вы хотите сгруппировать по Entity ID и проецировать идентификаторов связанных ролей в массив:

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

Попытка этого. Спасибо, Д Стэнли. – haltandcode

+0

Я думаю, что это работает отлично D Stanley, при первом запуске оказалось, что у него 3 записи, первый из которых правильный, а второй второй - 0,0. Однако после того, как блок кода был закончен, у GetEntityAuthorizations был только один набор, что было бы правильно. – haltandcode

+0

Рад, что это сработало. Отладка запросов Linq путем их проверки может быть сложной задачей. Обычно вам нужно посмотреть на конечные результаты, а затем попытаться проверить промежуточные результаты. –

Смежные вопросы