Надеюсь, что кто-то может пролить свет, и, возможно, возможное решение этой проблемы у меня ...
Я использовал LINQ to SQL для извлечения некоторых данных из базы данных в локальные объекты. Это продукты из корзины покупок. Продукт может содержать коллекцию KitGroups (которая хранится в EntitySet (System.Data.Linq.EntitySet). KitGroups содержат коллекции KitItems, а KitItems могут содержать вложенные продукты (которые ссылаются обратно на исходный тип продукта - поэтому его рекурсивный).
Из этих сущностей я создаю XML с использованием LINQ to XML - все хорошо, мой XML выглядит прекрасно, вызывая функцию «GenerateProductElement», которая вызывает себя рекурсивно для генерации вложенных продуктов. Прекрасные вещи.
Однако, вот где я застрял ... Сейчас я пытаюсь десериализовать этот XML обратно в исходные объекты (все автоматически сгенерированные Linq для SQL) ... и в этом заключается проблема. Linq tO Sql ожидает, что мои коллекции будут коллекциями EntitySet, однако Linq to Xml (который я пытаюсь использовать для десериализации) возвращает IEnumerable.
Я экспериментировал с несколькими способами приведения между двумя, но, похоже, ничего не работает ... Я начинаю думать, что мне следует просто десериализовать вручную (с некоторыми прикольными циклами и условными обозначениями, чтобы определить, к какой группе KitGroup относятся KitItems и т. д.) ... однако это действительно довольно сложно, и этот код, вероятно, будет довольно уродливым, поэтому я бы хотел найти более элегантное решение этой проблемы.
Есть предложения?
Вот фрагмент кода:
private Product GenerateProductFromXML(XDocument inDoc)
{
var prod = from p in inDoc.Descendants("Product")
select new Product
{
ProductID = (int)p.Attribute("ID"),
ProductGUID = (Guid)p.Attribute("GUID"),
Name = (string)p.Element("Name"),
Summary = (string)p.Element("Summary"),
Description = (string)p.Element("Description"),
SEName = (string)p.Element("SEName"),
SETitle = (string)p.Element("SETitle"),
XmlPackage = (string)p.Element("XmlPackage"),
IsAKit = (byte)(int)p.Element("IsAKit"),
ExtensionData = (string)p.Element("ExtensionData"),
};
//TODO: UUGGGGGGG Converting b/w IEnumerable & EntitySet
var kitGroups = (from kg in inDoc.Descendants("KitGroups").Elements("KitGroup")
select new KitGroup
{
KitGroupID = (int) kg.Attribute("ID"),
KitGroupGUID = (Guid) kg.Attribute("GUID"),
Name = (string) kg.Element("Name"),
KitItems = // THIS IS WHERE IT FAILS - "Cannot convert source type IEnumerable to target type EntitySet..."
(from ki in kg.Descendants("KitItems").Elements("KitItem")
select new KitItem
{
KitItemID = (int) ki.Attribute("ID"),
KitItemGUID = (Guid) ki.Attribute("GUID")
});
});
Product ImportedProduct = prod.First();
ImportedProduct.KitGroups = new EntitySet<KitGroup>();
ImportedProduct.KitGroups.AddRange(kitGroups);
return ImportedProduct;
}
enter code here
Я должен добавить, что все объекты, упомянутые здесь (Product, KitGroup, KitItem и т. Д.), Создаются Linq для SQL - без привязки к каким-либо другим объектам (корзина покупок не использует объекты, поэтому они существуют в этом контекст только в качестве средства для сериализации / десериализации в / из XML и базы данных. Функциональность, которую я создаю, - это возможность экспортировать продукт со всеми его группами Kit, KitItems и вложенными продуктами из одной среды и импортировать в другую.