首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IEnumerable转换为EntitySet

将IEnumerable转换为EntitySet
EN

Stack Overflow用户
提问于 2010-05-17 08:34:50
回答 1查看 6.7K关注 0票数 8

希望有人能给我一些启发,也许是我遇到的这个问题的可能解决方案……

我已经使用LINQ to SQL从数据库中提取一些数据到本地实体中。它们是购物车系统中的产品。产品可以包含KitGroups (存储在EntitySet (System.Data.Linq.EntitySet)中)的集合。KitGroups包含KitItems的集合,而KitItems可以包含嵌套的产品(它们链接回原始的Product类型-所以它是递归的)。

从这些实体开始,我使用LINQ to XML构建XML -这里一切都很好-我的XML看起来很漂亮,它调用了一个"GenerateProductElement“函数,该函数递归地调用自己来生成嵌套产品。很棒的东西。

然而,这就是我被卡住的地方..我现在正在尝试将XML反序列化为原始对象(全部由Linq to SQL自动生成)……这就是问题所在。Linq Xml期望我的集合是EntitySet集合,但是Linq tO to (我很想使用它)返回的是IEnumerable。

我已经尝试了几种在两者之间转换的方法,但似乎都不起作用……我开始认为我应该手动反序列化(使用一些时髦的循环和条件来确定哪个KitGroup KitItems属于哪个,等等)……然而,这真的很棘手,代码可能会很难看,所以我希望找到一个更优雅的解决方案来解决这个问题。

有什么建议吗?

下面是一个代码片段:

代码语言:javascript
复制
    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 to SQL生成的-没有映射回任何其他实体(购物车不使用实体,因此它们在此上下文中仅作为序列化/反序列化到/从xml和数据库的一种手段存在。我正在构建的功能是能够将产品及其所有工具组、kitItems和嵌套产品从一个环境中导出,然后导入到另一个环境中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-17 14:32:53

发现下面的链接很有用。

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

编辑:如果上面的链接断开,解决方案是创建一个扩展方法

代码语言:javascript
复制
public static EntitySet<T> ToEntitySet<T> (this IEnumerable<T> source) where T : class
{
    var es = new EntitySet<T> ();
    es.AddRange (source);
    return es;
}

然后,子查询可以使用.ToEntitySet()

代码语言:javascript
复制
...
(from ki in kg.Descendants("KitItems").Elements("KitItem")
select new KitItem
{
    KitItemID = (int) ki.Attribute("ID"),
    KitItemGUID = (Guid) ki.Attribute("GUID")
}).ToEntitySet();
...
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2846098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档