分层实体框架查询异常

10
我正在尝试使用Entity Framework构建一个分层的集合 - 请参考以下查询 - 在给定公司中的每个成员都有一个父成员,但是在尝试执行此操作时,我遇到了以下异常:
  

System.NotSupportedException:类型'Member'出现在单个LINQ to Entities查询中的两个结构不兼容的初始化中。可以在同一查询中的两个位置中初始化类型,但前提是必须在两个位置都设置相同的属性并且这些属性以相同的顺序设置。

如果我删除ParentMember分配,则正常工作 - 有什么想法?
        return from c in _Entities.Company
               where c.Deleted == false
                select new Member()
                {
                    Name = c.Name,
                    ParentMember = new Member() 
                    {
                        Name = c.ParentMember.Name
                    }
                }; 
3个回答

12

我还没有尝试过这个,但错误信息给了你一个提示:在两个地方中你没有以相同的顺序设置相同的属性。

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


我刚刚更新了问题中的代码以反映实际代码 - 我按照相同的顺序设置完全相同的属性,唯一的例外是设置ParentMember的ParentMember属性,如果这有意义的话。 - Robert W
1
实际上,您仍未设置所有相同的参数:外部具有名称和父成员,而您仅为内部设置了名称。尝试将属性分配为空。 - chris

2

尝试

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
                    }
                }); 

2
+1 这个死循环的情况刚刚困扰了我,而这是我独立想出来的解决方案。虽然不如我希望的那么优雅,而且有点浪费,因为我们需要实例化对象两次,但依然有效。 - Shaul Behr

1
当您尝试在每个成员记录中检索相同字段时,您将得到一个成员记录的递归。您不能只是将最后一个父记录设置为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
    };
}

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