Исключение запроса иерархической структуры 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
                    }
                }; 

Ответ 1

Я не пробовал это, но сообщение об ошибке дает вам ключ: вы не устанавливаете одинаковые свойства в том же порядке в обоих местах.

Что произойдет, если вы попытаетесь установить свойство ID на внешнем элементе Member()?

Ответ 2

Try

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

Ответ 3

В результате вы получите рекурсию записей элементов, когда вы попытаетесь получить одни и те же поля в каждом из них. Вы не можете просто сделать последнюю родительскую запись равной нулю.

Я хотел бы получить то, что мог, а затем создать запись с дальнейшими запросами. Обратите внимание, что для вашей компании требуется поле 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
    };
}