2010-08-12 12 views
7

que estoy recibiendo este error:¿Qué significa el error "... Constructores sin parámetros e inicializadores compatibles ..."?

Only parameterless constructors and initializers are supported in LINQ to Entities. 

Al intentar ejecutar el código (que se encuentra el código here y base de datos de prueba hecha para jugar con):

XElement xml = new XElement("contacts", 
        from c in db.Contacts 
        orderby c.ContactId 
        select new XElement("contact", 
           new XAttribute("contactId", c.ContactId), 
           new XElement("firstName", c.FirstName), 
           new XElement("lastName", c.LastName)) 
        ); 

donde db se crea el automóvil entidades objeto. ¿Alguna idea sobre cómo hacer que esto funcione?

Respuesta

6

Creo que se opone al hecho de que está utilizando un constructor XElement que toma parámetros en su cláusula "select". Como XElement no tiene un constructor sin parámetros, es posible que necesite cambiar el código para seleccionar un tipo anónimo e inicializar la colección XElement después del hecho.

var els = from c in db.Contacts 
      orderby c.ContactID 
      select new { c.ContactID, c.FirstName, c.LastName }; 

var xml = new XElement("contacts", 
    els.ToList() 
     .Select(e => new XElement("contact", 
         new XAttribute("contactID", e.ContactID), 
         new XElement("firstName", e.FirstName), 
         new XElement("lastName", e.LastName)))); 

Eso no se ha probado, pero espero que te dé la idea. Primero hago la consulta EF y luego invoco a ToList() para que pueda seleccionar la colección XElement utilizando Linq para objetos en lugar de EF.

+0

Gracias! Eso funciona, que es la parte importante :)! Todavía estoy confundido acerca de por qué el código original no funcionó, he visto otros ejemplos similares creando documentos XML. ¿Algunas ideas? – Evan

+0

Por el error, parece que EF simplemente no admite la selección de objetos que no tienen ctors sin parámetros. No sé por qué existe esta limitación, pero sí, sacar la consulta EF de la ecuación resuelve el problema. –

+0

Gracias. Esta respuesta me ayudó hoy. – jessegavin

1

Me gustaría volver a escribir así:

XElement xml2 = new XElement("contacts", 
        from c in 
        ((IEnumerable<Contact>)(from c in Contacts 
        orderby c.ContactId 
        select c)) 
       select new XElement("contact", 
         new XAttribute("contactId", c.ContactId), 
         new XElement("firstName", c.FirstName), 
         new XElement("lastName", c.LastName)) 
      ); 

El punto es separar árbol de ejecución de LINQ XElement de instancias. Al convertir la consulta LINQ de IQueriable a IEnumerable, separará el código que LINQ utilizará para obtener datos del código que va a crear sus XElements.

+0

Idea interesante ... Recientemente me enfrenté a esta limitación de EF y opté por algo similar a la solución de @ Matt. Si miramos ahora [los documentos de AsEnumerable] (http://msdn.microsoft.com/en-us/library/bb335435.aspx), parece que es exactamente para lo que está diseñado ... – shambulator

Cuestiones relacionadas