2013-04-16 5 views
1

Я хотел бы сгенерировать XDocument из моей таблицы (структура отличается), но я продолжаю получать следующую ошибку: LINQ to Entities не распознает метод «System.String ToString (System.String ToString)).Linq to XML - Из таблицы в XDocument

Я знаю, что это вызвано, и я Дата рождения нужно будет использовать SqlFunctions.StringConvert, но я работаю с Framework 4.0

Любые идеи о том, как решить это?

// Newsletter subscriptions 
var news = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement("USER", 
      from n in _dc.Newsletter_Datas 
      where n.Timestamp >= startDate 
      select 
       new XElement("ROW", 
        new XElement("UTI", n.ID), 
        new XElement("FIRSTNAME", n.FirstName), 
        new XElement("FAMILYNAME", n.LastName), 
        new XElement("GENDER", n.Gender), 
        new XElement("BIRTHDATE", n.BirthDate != null ? n.BirthDate.Value.ToString("yyyy-MM-dd") : "2003-01-01"), 
        new XElement("LANGUAGE", n.Language), 
        new XElement("EMAIL", n.Email), 
        new XElement("STREETNAME", n.StreetName), 
        new XElement("HOUSENR", n.HouseNr), 
        new XElement("BOXNR", n.BoxNr), 
        new XElement("ZIPCODE", n.Zipcode), 
        new XElement("CITY", n.City), 
        new XElement("COUNTRY", n.Country), 
        new XElement("TS", n.Timestamp.ToString("yyyy-MM-dd hh:mm:ss")), 
        new XElement("MESSAGE_ID", "SCNEWS02"), 
        new XElement("OPT_INS", 
         new XElement("OPT_IN", 
          new XElement("OPT_IN_CBP", "01000000000"), 
          new XElement("OPT_IN_INSERT_TS", n.Timestamp.ToString("yyyy-MM-dd hh:mm:ss")), 
          new XElement("OPT_IN_METHOD", "1"), 
          new XElement("OPT_IN_TYPE", n.OptIn), 
          new XElement("OPT_IN_CHANNEL", "2")))))); 

Большое спасибо

+0

SqlFunctions.StringConvert доступен на .NET Framework 4 (http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.stringconvert(v=vs.100) .aspx). В качестве альтернативы вы можете попробовать 'string.Format()' форматировать строку на клиенте, а не в базе данных. – Pawel

+0

Итак, какой тип даты рождения? – lexeRoy

ответ

1

Разбейте свой запрос на отдельные части, первая часть является сам запрос. Это будет обрабатываться инфраструктурой сущности. Затем выполните этот запрос до IEnumerable<NewsletterData>, чтобы завершить его с помощью LINQ для объектов. Entity Framework не может делать больше, чем простая проекция (которую вы явно не делаете).

var query = 
    from n in _dc.Newsletter_Datas 
    where n.Timestamp >= startDate 
    select n; 
var news = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), 
    new XElement("USER", 
     from n in query.AsEnumerable() // LINQ to objects 
     select new XElement("ROW", 
      new XElement("UTI", n.ID), 
      new XElement("FIRSTNAME", n.FirstName), 
      new XElement("FAMILYNAME", n.LastName), 
      new XElement("GENDER", n.Gender), 
      new XElement("BIRTHDATE", n.BirthDate != null ? n.BirthDate.Value.ToString("yyyy-MM-dd") : "2003-01-01"), 
      new XElement("LANGUAGE", n.Language), 
      new XElement("EMAIL", n.Email), 
      new XElement("STREETNAME", n.StreetName), 
      new XElement("HOUSENR", n.HouseNr), 
      new XElement("BOXNR", n.BoxNr), 
      new XElement("ZIPCODE", n.Zipcode), 
      new XElement("CITY", n.City), 
      new XElement("COUNTRY", n.Country), 
      new XElement("TS", n.Timestamp.ToString("yyyy-MM-dd hh:mm:ss")), 
      new XElement("MESSAGE_ID", "SCNEWS02"), 
      new XElement("OPT_INS", 
       new XElement("OPT_IN", 
        new XElement("OPT_IN_CBP", "01000000000"), 
        new XElement("OPT_IN_INSERT_TS", n.Timestamp.ToString("yyyy-MM-dd hh:mm:ss")), 
        new XElement("OPT_IN_METHOD", "1"), 
        new XElement("OPT_IN_TYPE", n.OptIn), 
        new XElement("OPT_IN_CHANNEL", "2") 
       ) 
      ) 
     ) 
    ) 
); 
+0

Большое спасибо, Джефф! – DnBase