2010-08-12 10 views
7

Bu hatayı alıyorum:"... parametresiz yapıcılar ve başlatıcılar destekleniyor ..." hatası ne anlama geliyor?

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

(uğraşmak için bu kodu here ve yapılan test veritabanı bulundu) bu kodu çalıştırmak için çalışıyor:

db otomatik oluşturulur
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)) 
        ); 

varlıklar nesnesi. Bunu nasıl çalıştıracağınıza dair herhangi bir fikir var mı?

cevap

6

"Seç" yan tümcesinde parametre alan bir XElement kurucusu kullandığınız gerçeğine itiraz ediyor. XElement parametresiz bir kurucuya sahip olmadığı için, bir anonim tip seçmek için kodunuzu değiştirmeniz gerekebilir ve ardından XElement koleksiyonunu başlatabilirsiniz.

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

Bu test edilmemiş, ancak umarım size fikir verir. İlk önce EF sorgusunu yapıyorum ve daha sonra ToList() 'i çağırıyorum, böylece EF yerine Nesneler için Linq kullanarak XElement koleksiyonunu seçebiliyorum.

+0

Teşekkürler! Bu önemli kısmı olan çalışır :)! Yine de orijinal kodun neden çalışmadığı konusunda kafam karışıyor, XML belgelerini yaratan benzer örnekler gördüm. Herhangi bir fikir? – Evan

+0

Hata ile, EF parametreleriniz olmayan nesnelerin seçilmesini desteklemiyor. Neden bu sınırlamanın var olduğunu bilmiyorum ama evet, EF sorgusunu denklemden çıkarmak problemi çözüyor. –

+0

Teşekkürler. Bu cevap bugün bana yardımcı oldu. – jessegavin

1

böyle yeniden yazmak olacaktır:

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

noktası XElement örnekleme gelen LINQ yürütme ağacı ayırmaktır. LINQ sorgulamasını IQueriable'dan IEnumerable'a göndererek, LINQ'un XElements'larınızı oluşturacak koddan veri almak için kullanacağı kodu ayıracaksınız.

+0

İlginç bir fikir ... Geçenlerde bu EF kısıtlamasına karşı çıktım ve Matt'in çözümüne benzer bir şeyle karşılaştım. Şu anda [AsEnumerable için dokümanlar] baktığımızda (http://msdn.microsoft.com/en-us/library/bb335435.aspx), tam olarak bunun için tasarlandığı gibi görünüyor. – shambulator