Надеясь кто-то может пролить некоторый свет и возможно возможное решение этой проблемы, которую я имею...
Я привык LINQ для SQL для получения по запросу некоторых данных из базы данных в локальные объекты. Они - продукты от системы корзины. Продукт может содержать набор KitGroups (которые хранятся в EntitySet (Система. Данные. Linq. EntitySet). KitGroups содержат наборы KitItems, и KitItems может содержать Вложенные продукты (которые связываются назад до исходного Типа продукта - так его рекурсивное).
От этих объектов я создаю XML, использующий LINQ для XML - всей пользы здесь - мой XML выглядит красивым, вызывая функцию "GenerateProductElement", которая называет себя рекурсивно для генерации вложенных продуктов. Замечательный материал.
Однако вот то, где я застреваю.. я теперь пытаюсь десериализовать это XML назад к исходным объектам (все автоматически сгенерированные Linq к SQL)... и здесь лежу проблема. Linq к Sql ожидает, что мои наборы будут наборами EntitySet, однако Linq к Xml (который я пытаюсь использовать для десериализовывания), возвращает IEnumerable.
Я экспериментировал с несколькими способами бросить между этими 2, но ничто, кажется, не работает... Я начинаю думать, что я должен просто десериализовать вручную (с некоторыми броскими циклами и условными выражениями для определения, какой 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
Я должен добавить, что все объекты, упомянутые здесь (продукт, KitGroup, KitItem, и т.д.), сгенерированы Linq к SQL - без отображения назад на любые другие объекты (корзина не использует объекты, таким образом, они существуют в этом контексте только как средство сериализировать/десериализовать к/от xml и базе данных. Функциональность, которую я создаю, является способностью экспортировать продукт со всем его kitgroups, kitItems и вложенные продукты от одной среды и импорт в другого.
Считайте следующую ссылку полезной.
РЕДАКТИРОВАТЬ: в случае разрыва указанной выше ссылки решение заключается в создать метод расширения
public static EntitySet<T> ToEntitySet<T> (this IEnumerable<T> source) where T : class
{
var es = new EntitySet<T> ();
es.AddRange (source);
return es;
}
Подзапрос может затем использовать .ToEntitySet ()
...
(from ki in kg.Descendants("KitItems").Elements("KitItem")
select new KitItem
{
KitItemID = (int) ki.Attribute("ID"),
KitItemGUID = (Guid) ki.Attribute("GUID")
}).ToEntitySet();
...