Исключение запроса Hierarchical Entity Framework - PullRequest
10 голосов
/ 09 ноября 2010

Я пытаюсь создать иерархическую коллекцию с использованием 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 ]

12 голосов
/ 09 ноября 2010

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

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

2 голосов
/ 09 апреля 2013

Попробуйте

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 голос
/ 20 марта 2013

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

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