c# - 将 IEnumerable 转换为 EntitySet

标签 c# .net linq-to-sql linq-to-xml ienumerable

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

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

我正在使用 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 生成的——没有映射回任何其他实体(购物车不使用实体,因此它们存在于此context 仅作为序列化/反序列化到/从 xml 和数据库的一种方式。我正在构建的功能是能够从一个环境中导出产品及其所有套件组、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();
...

关于c# - 将 IEnumerable 转换为 EntitySet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2846098/

相关文章:

c# - 与 ASP.NET 4 和 SQL Server 中的存储过程一起使用的 ORM

c# - 添加导航 :Frame causes NullReferenceException

c# - 散列过程如何在 Dictionary<TKey, TValue> 中工作

.NET 序列化类设计问题

c# - 面板 2 的 splitcontainer splitterdistance

c# - LINQ-To-SQL 如何防止 SQL 注入(inject)?

C# ASP .NET MVC 3单例构造函数调用两次

c# - 当我进行 Web 引用时,Reference.cs 文件中缺少一个类

c# - LINQ 实体数据模型生成的代码错误 - 类型 'DBContexts.Category' 已包含 'ID' 的定义

c# - 使用 Linq2Sql 的最佳方式?