分层实体框架查询异常

时间:2010-11-09 15:54:53

标签: c# entity-framework

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

  

System.NotSupportedException:类型   “会员”在结构上出现在两个方面   一个不兼容的初始化   单个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 个答案:

答案 0 :(得分:12)

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

如果您尝试在外部Member()上设置ID属性会怎样?

答案 1 :(得分: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)

当您尝试在每个记录中检索相同的字段时,最终会得到成员记录的递归。您不能只使最后一个父记录等于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
    };
}