Использование SelectMany для получения коллекции сущностей с родителями создает исключение InvalidOperationException - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть модель БД, которая имеет свойство Parent своего собственного типа, например:

public class MainModel 
{
    public int Id { get; set; }

    public Entity Entity { get; set; };
}

public class Entity 
{
    public int Id { get; set; }

    public int ParentId { get; set; }
    public Entity Parent { get; set; }
}

Теперь я хочу получить коллекцию всех сущностей, связанных с экземпляром MainModel. До сих пор я пытался использовать SelectMany, создавая новый массив сущностей, содержащий саму сущность и ее родителя. Но это вызывает исключение InvalidOperationException

modelInstances.SelectMany(m => new []{ m.Entity, m.Entity.Parent });

:

System.InvalidOperationException
Processing of the LINQ expression 'm => new Entity[]
{
    m.Entity,
    m.Entity.Parent,
    m.Entity.Parent.Parent 
}' by 'NavigationExpandingExpressionVisitor' failed. 
This may indicate either a bug or a limitation in  EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.

Я несколько сбит с толку, поскольку в EFCore Docs говорится, что SelectMany является поддерживается LINQ-to- SQL

Кто-нибудь знает, что мне здесь не хватает? Или другой способ получить список сущности с ее родителями.

1 Ответ

1 голос
/ 02 апреля 2020

Я полагаю, что это не может перевести создание массива в SQL. Я бы попытался загрузить данные, которые вы хотите в форме, которая поддерживается Entity Framework.

Я бы выбрал данные, получил их из БД и затем преобразовал результат так, как вы хотите. Что-то вроде:

var listOfEntitiesAndParents = modelInstances.Select(m => new { m.Entity, m.Entity.Parent }).ToList();

var flatList = listOfEntitiesAndParents.SelectMany(e=>new [] {e.Entity, e.Parent}).ToList();

ИЛИ var flatList = listOfEntitiesAndParents.Select (e => e.Entity) .Union (listOfEntitiesAndParents.Select (e => e.Parent)). ToList ();

Надеюсь, это поможет

...