Преобразуйте IEnumerable в EntitySet

Надеясь кто-то может пролить некоторый свет и возможно возможное решение этой проблемы, которую я имею...

Я привык 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 и вложенные продукты от одной среды и импорт в другого.

7
задан Jeeby 17 May 2010 в 00:43
поделиться

1 ответ

Считайте следующую ссылку полезной.

http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/58c4dcf8-2d89-4a3c-bb30-58c7c15df04b


РЕДАКТИРОВАТЬ: в случае разрыва указанной выше ссылки решение заключается в создать метод расширения

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();
...
17
ответ дан 6 December 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: