KeyValuePair - нет конструктора без параметров? - PullRequest
5 голосов
/ 01 июня 2011

У меня есть объект со свойством типа KeyValuePair.

Я хотел бы прочитать некоторые данные из базы данных и сохранить результаты в этом поле типа KeyValuePair.

myObject.KeyValuePairs = ctx.ExecuteQuery<KeyValuePair<String, int>>
                        ("Select " +
                            "[" + q.Name + "] As [Key]" +
                            ", Count([" + q.Name + "]) As [Value] From SomeTable" + 
                            " Group By [" + q.Name + "]").ToList(); 

myObject.KeyValuePairs является List<KeyValuePair<String, int>>

Когда я пытаюсь прочитать записи, я получаю следующее исключение:

Тип 'System.Collections.Generic.KeyValuePair`2 [System.String, System.Int32]' должен объявлять конструктор по умолчанию (без параметров), чтобы его можно было создать во время отображения.

У меня есть конструктор по умолчанию в классе, но это не решает проблему. Похоже, что он не знает, как создать объект KeyValuePair. Разве у него нет конструктора по умолчанию? Confused ..

Спасибо

1 Ответ

14 голосов
/ 01 июня 2011

У него есть открытый конструктор без параметров, потому что KeyValuePair<TKey, TValue> является структурой, а все структуры имеют неявный открытый конструктор без параметров.

Проблема в том, что EF не может найти его по отражению, потому что отражение не возвращает конструктор по умолчанию для структуры.

Вот почему EF сообщает, что не может найти его (не может найти его по отражению).

Кроме того, даже если вы можете использовать конструктор по умолчанию с помощью отражения, KeyValuePair<TKey, TValue> является неизменным, и поэтому вы не можете установить Key и Value после построения.

Чтобы решить вашу проблему, определите пользовательский класс

class NameCount {
    public string Name { get; set; }
    public int Count { get; set; }
}

и измените свой запрос, чтобы он возвращал Key как Name и Value как Count. Я предполагаю, что вы можете придумать лучшее имя для своего пользовательского класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...