繁体   English   中英

将IEnumerable转换为EntitySet

[英]Convert IEnumerable to EntitySet

希望有人可以解决一些问题,也许可以解决这个问题,我有......

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

从这些实体我使用LINQ to XML构建XML - 这里很好 - 我的XML看起来很漂亮,调用了一个“GenerateProductElement”函数,它以递归方式调用自身来生成嵌套产品。 精彩的东西。

但是,这就是我被困住的地方..我现在正试图将XML反序列化回原始对象(所有这些都由Linq自动生成到SQL)......这就是问题所在。 Linq tO Sql希望我的集合是EntitySet集合,但是Linq to Xml(我正在使用deserailise)正在返回IEnumerable。

我已尝试在两者之间进行一些投射,但似乎没有任何工作......我开始认为我应该手动反序列化(使用一些时髦的循环和条件来确定哪些KitGroup KitItem属于,等等)...但它真的很棘手,而且代码可能很难看,所以我很想找到一个更优雅的解决方案来解决这个问题。

有什么建议?

这是一段代码片段:

    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和数据库进行序列化/反序列化的方法。我正在构建的功能是能够从一个环境导出包含其所有kitgroups,kitItems和嵌套产品的产品,并导入到另一个环境中。

查找以下链接有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM