2010-05-17 7 views
7

Con la esperanza de que alguien puede arrojar algo de luz, y tal vez una posible solución a este problema que estoy teniendo ...IEnumerable a EntitySet

he utilizado LINQ a SQL para extraer algunos datos de una base de datos en entidades locales. Son productos de un sistema de carrito de compras. Un producto puede contener una colección de KitGroups (que se almacenan en un EntitySet (System.Data.Linq.EntitySet). KitGroups contiene colecciones de KitItems, y KitItems puede contener Productos anidados (que enlazan con el tipo de Producto original, por lo que es recursivo)

De estas entidades estoy construyendo XML usando LINQ to XML - todo bien aquí - mi XML se ve hermoso, llamando a una función "GenerateProductElement", que se llama de forma recursiva para generar los productos anidados. Cosas maravillosas

Sin embargo, aquí es donde estoy atascado ... ahora estoy tratando de deserializar ese XML de vuelta a los objetos originales (todos autogenerados por Linq a SQL) ... y este es el problema. Linq tO Sql espera mis colecciones ser colecciones de EntitySet, sin embargo, Linq a Xml (que soy tyr para usar para deserailizar) está devolviendo IEnumerable.

He experimentado con algunas formas de conversión entre los 2, pero nada parece funcionar ... Estoy empezando a pensar que debo deserializar manualmente (con algunos bucles y condicionales funky para determinar qué Kit Kit de artículos) pertenecer a, etc) ... sin embargo, es realmente bastante complicado y ese código es bastante feo, así que me encantaría encontrar una solución más elegante para este problema.

¿Alguna sugerencia?

He aquí un fragmento de código:

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 

debo añadir que todas las entidades mencionadas aquí (Producto, KitGroup, KitItem, etc) que son generados por LINQ a SQL - sin mapeo de nuevo a cualquier otra entidad (el carrito de compras no usa entidades, por lo que existen en este contexto solo como medio para serializar/deserializar a/desde xml y la base de datos. La funcionalidad que estoy desarrollando es la capacidad de exportar un producto con todos sus grupos de juegos, kitItems y productos anidados de un entorno, e importar a otro.

Respuesta

17

Encontrar los siguientes enlaces til.

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


EDIT: en caso de que el enlace de arriba nunca se rompe, la solución es crear un método de extensión

public static EntitySet<T> ToEntitySet<T> (this IEnumerable<T> source) where T : class 
{ 
    var es = new EntitySet<T>(); 
    es.AddRange (source); 
    return es; 
} 

Subconsulta continuación, puede utilizar .ToEntitySet()

... 
(from ki in kg.Descendants("KitItems").Elements("KitItem") 
select new KitItem 
{ 
    KitItemID = (int) ki.Attribute("ID"), 
    KitItemGUID = (Guid) ki.Attribute("GUID") 
}).ToEntitySet(); 
... 
+0

Ah sí, eso es exactamente lo que buscaba ... ¡gracias a Jinal! – Jeeby

+0

¡Me ayudó también, gracias! –

+0

Gracias amigo, me salvaste. He estado luchando con el mismo problema desde hace mucho tiempo ... –

Cuestiones relacionadas