【问题标题】:Hierarchical Entity Framework Query Exception分层实体框架查询异常
【发布时间】:2010-11-09 15:54:52
【问题描述】:

我正在尝试使用实体框架构建分层集合 - 请参阅以下查询 - 给定公司中的每个成员都有一个父成员 - 但在尝试执行此操作时,我得到以下异常:

System.NotSupportedException:类型 “成员”在结构上以两种形式出现 内不兼容的初始化 单个 LINQ to Entity 查询。一种 可以在两个地方初始化 相同的查询,但前提是相同的 在这两个地方都设置了属性,并且 这些属性设置在相同的 命令。

如果我删除 ParentMember 分配它可以工作 - 关于发生了什么的任何想法?

        return from c in _Entities.Company
               where c.Deleted == false
                select new Member()
                {
                    Name = c.Name,
                    ParentMember = new Member() 
                    {
                        Name = c.ParentMember.Name
                    }
                }; 

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    试试

    return (from c in _Entities.Company
                   where c.Deleted == false
                    select new
                    {
                        c.Name,
                        ParentMember = new
                        {
                            c.ParentMember.Name
                        }
                    })
    .AsEnumerable()
    .Select(c=> new Member
                    {
                        Name = c.Name,
                        ParentMember = new Member
                        {
                            Name = c.ParentMember.Name
                        }
                    }); 
    

    【讨论】:

    • +1 这种catch-22 情况让我很痛苦,这是我独立提出的解决方案。没有我希望的那么优雅,而且有点浪费,因为我们必须将对象实例化加倍,但仍然有效。
    【解决方案2】:

    我还没有尝试过,但是错误消息给了你一个线索:你没有在两个地方以相同的顺序设置相同的属性。

    如果您尝试在外部 Member() 上设置 ID 属性会发生什么?

    【讨论】:

    • 我刚刚更新了问题中的代码以反映实际代码 - 除了设置 ParentMember 的 ParentMember 属性之外,我以相同的顺序设置了完全相同的属性,如果那样的话有道理。
    • 实际上,您仍然没有设置所有相同的参数:外部具有 Name 和 ParentMember,而您只是为内部设置了 Name。尝试将属性分配为 null。
    【解决方案3】:

    当您尝试检索每个成员记录中的相同字段时,您最终会得到成员记录的递归。您不能只使最后一条父记录等于 null。

    我会检索我可以检索的内容,然后通过进一步的查询建立记录。请注意,您的公司实体将需要 ParentId 字段或类似字段。

    var members = 
      return from c in _Entities.Company
      select new Member()
      {
        Name = c.Name,
        ParentId = c.ParentId
      }; 
    

    现在迭代并添加父记录。

    foreach (var member in members)
    {
      member.ParentMember = new Member 
        {
          Name = _Entities.Company.First(c => c.Id == member.ParentId).Name
        };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      相关资源
      最近更新 更多