将IEnumerable转换为EntitySet

8
希望有人能够解决我遇到的问题,并提供可能的解决方案...我使用LINQ to SQL从数据库中获取了一些数据到本地实体中。它们是购物车系统中的产品。一个产品可以包含一组KitGroups(存储在EntitySet(System.Data.Linq.EntitySet)中)。KitGroups包含KitItems集合,而KitItems可以包含Nested Products(它们链接回原始Product类型 - 因此它是递归的)。
我正在使用LINQ to XML构建XML来生成这些实体 - 一切都很顺利 - 我的XML看起来很漂亮,调用“GenerateProductElement”函数,该函数递归调用自身以生成嵌套产品。非常棒。
然而,在这里我卡住了...我现在正在尝试将XML反序列化回原始对象(由Linq to 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 to SQL生成的,没有映射回其他实体(购物车不使用实体,因此它们只存在于此上下文中,作为将xml序列化/反序列化到/从数据库的手段)。我正在构建的功能是能够将一个产品及其所有套件组、套件项和嵌套产品从一个环境导出,并导入到另一个环境中。

1个回答

20
以下链接很有用。 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();
...

啊,是的,那正是我想要的...非常感谢你,Jinal! - Jeeby
谢谢伙计,你救了我。我一直在为同样的问题苦苦挣扎... - Shilpa Soni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接