Конвертировать IEnumerable в EntitySet - PullRequest
7 голосов
/ 17 мая 2010

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

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

1 Ответ

17 голосов
/ 17 мая 2010

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

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