2010-08-12 7 views
7

Ich erhalte diese Fehlermeldung:Was bedeuten die "... parameterlosen Konstruktoren und Initialisierer werden unterstützt ..." Fehler bedeuten?

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

Wenn Sie diesen Code ausführen versuchen (diese Code-Datenbank here und machte Test gefunden zu spielen, um):

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)) 
        ); 

wo db wird das Auto erstellt Entitätsobjekt Irgendwelche Ideen, wie man das zum Laufen bringt?

Antwort

6

Ich glaube, es widerspricht der Tatsache, dass Sie einen XElement-Konstruktor verwenden, der Parameter in Ihrer "Select" -Klausel annimmt. Da XElement über keinen parameterlosen Konstruktor verfügt, müssen Sie möglicherweise Ihren Code ändern, um einen anonymen Typ auszuwählen, und die XElement-Sammlung anschließend initialisieren.

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)))); 

Das ist ungetestet, aber hoffentlich gibt Ihnen die Idee. Ich führe zuerst die EF-Abfrage durch und rufe dann ToList() auf, damit ich die XElement-Sammlung mit Linq to Objects statt EF auswählen kann.

+0

Danke! Das funktioniert, das ist der wichtige Teil :)! Ich bin immer noch irgendwie verwirrt darüber, warum der ursprüngliche Code nicht funktioniert hat. Ich habe andere ähnliche Beispiele gesehen, die XML-Dokumente erstellen. Irgendwelche Ideen? – Evan

+0

Durch den Fehler scheint es, dass EF nur die Auswahl von Objekten unterstützt, die keine Parameterless-Ctors haben. Ich weiß nicht, warum diese Einschränkung existiert, aber ja, wenn man die EF-Abfrage aus der Gleichung herauszieht, wird das Problem gelöst. –

+0

Danke. Diese Antwort hat mir heute geholfen. – jessegavin

1

Ich würde es so umschreiben:

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)) 
      ); 

Der Punkt ist LINQ Ausführung Baum von XElement Instantiierung zu trennen. Wenn Sie die LINQ-Abfrage von IQueriable auf IEnumerable anwenden, trennen Sie den Code, den LINQ zum Abrufen von Daten aus dem Code verwendet, der Ihre XElements erstellen soll.

+0

Interessante Idee ... Ich bin kürzlich auf diese EF-Beschränkung gestoßen und habe etwas Ähnliches wie @ Matts Lösung gemacht. Wenn man sich nun die [docs for AsEnumerable] (http://msdn.microsoft.com/en-us/library/bb335435.aspx) ansieht, scheint es genau das zu sein, wofür es entworfen wurde ... – shambulator

Verwandte Themen