2011-06-01 34 views
5

Tengo un objeto que tiene una propiedad de tipo KeyValuePair.KeyValuePair: ¿ningún constructor sin parámetros?

Me gustaría leer algunos datos de una base de datos y almacenar resultados en este campo tipo de 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 es una List<KeyValuePair<String, int>>

Cuando intento para leer los registros que recibo la siguiente excepción:

El tipo 'System.Collections.Generic.KeyValuePair`2 [System.String, Sistema .Int32] 'debe declarar un constructor predeterminado (sin parámetros) para que se construya durante el mapeo.

Tengo un constructor predeterminado en una clase, pero esto no soluciona el problema. Parece que no sabe cómo construir un objeto KeyValuePair. ¿No tiene un constructor predeterminado? Confundido ..

Gracias

+5

Por favor, parametrice su sql Bobby Tables .... – BFree

+1

@BFree: +1 para http://xkcd.com/327/ –

Respuesta

14

Tiene un constructor sin parámetros pública porque KeyValuePair<TKey, TValue> es una estructura struct y todos tienen implícita constructor sin parámetros pública.

El problema es que EF no puede encontrarlo por reflexión porque la reflexión no devuelve el constructor predeterminado para struct.

Es por eso que EF informa que no puede encontrarlo (no puede encontrarlo por reflexión).

Además, incluso si usted podría utilizar el constructor predeterminado por la reflexión, KeyValuePair<TKey, TValue> es inmutable y lo que no se puede establecer el Key y Value después de la construcción.

para resolver su problema, defina una clase personalizada

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

y cambiar la consulta para devolver el Key como Name y Value como Count. Supongo que puedes encontrar un nombre mejor para tu clase personalizada.

+2

var f = new KeyValuePair (); <--- esto se compila muy bien ... Todas las estructuras tienen un parámetro predeterminado menos constructor de forma predeterminada: http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx – BFree

+0

¡Tu aprendes algo nuevo cada dia! –

+1

OK, ESTO tiene sentido ..... +1 – BFree

Cuestiones relacionadas