Получение значений из 3 моделей, где 1 модель является основным корнем, с использованием lambda / linq ef c#

Всем добрый день,

Я пытаюсь получить данные из базы данных с помощью EF.

У меня есть 3 эти 3 образца модели

public class Info { 
    [Key] public int InfoId {get;set;}
    public string infoName {get;set;}

    public ICollection<SubInfo> SubInfo {get;set;}
 }

 public class SubInfo { 
    [Key] public int SubInfoId {get;set;}
    public string subInfoName {get;set;}

    public Info Info {get;set}
    public int InfoId {get;set;}
    public ICollection<SubSubInfo> SubSubInfo {get;set;}
 }

 public class SubSubInfo { 
    [Key] public int SubSubInfoId {get;set;}
    public string subInfoName {get;set;}

    public SubInfo SubInfo {get;set}
    public int SubInfoId {get;set;}
 }

Объяснение моделей: Info является основным, SubInfo - вспомогательным элементом основной информации, а SubSubInfo - вспомогательной частью вспомогательной информации.

Пока я использую этот похожий код для получения данных, и он отлично работает

var info = context.Info.Include(x=>x.SubInfo).ToList();

Но проблема в том, что SubSubInfo пуст внутри результата.

Я пробовал это: var info = context.Info.Include(x=>x.SubInfo.Select((y=>y.SubSubInfo)));, но получаю сообщение об ошибке: InvalidOperationException: The Include property lambda expression 'x => ...

0
0
222
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

var info = context.Info.Include(x=> x.SubInfo)
                       .Include(x=> x.SubInfo.Select(y=> y.SubSubInfo ));

Также вы можете использовать ThenInclude (), если используете EF Core.
См. Ссылку ниже для получения дополнительной информации
http://entityframework.net/include-multiple-levels

Я попробовал. Но выдает ошибку, в которой написано, что аналогичный InvalidOperationException: The Include property lambda expression 'x => {from SubInfo y in x.SubInfo select [y].SubSubInfo}' is invalid. The expression should represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, specify an explicitly typed lambda parameter of the target type, E.g. '(Derived d) => d.MyProperty'.

jsonGPPD 10.09.2018 08:44

Но поскольку я использую EF Core, ThenInclude() работает нормально. Спасибо, сэр, за подсказку

jsonGPPD 10.09.2018 08:47

То, чего вы пытаетесь достичь, можно легко сделать с помощью Нетерпеливая загрузка, о котором можно узнать больше здесь или здесь. Ошибка, которую вы получаете, заключается в том, что вы не можете комбинировать LINQ с необработанным SQL (Include и Select в вашем случае).

Другими словами, вы пытаетесь выполнить Загрузить несколько объектов, чего можно достичь с помощью кода, подобного следующему:

var info = context.Info.Include("SubInfo.SubSubInfo").ToList();

Изменить начало

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

using (var context = new BloggingContext())
{
    var blogs = context.Blogs
        .Include(blog => blog.Posts)
            .ThenInclude(post => post.Author)
        .ToList();
}

и для вашего контекста это будет:

var info = context.Info.
           Include(subInfo => subInfo.SubInfo).
           ThenInclude(subSubInfo => subSubInfo.SubSubInfo).
           ToList();

где SubInfo и SubSubInfo - это свойства навигации ваших моделей. Также примите во внимание, что вы должны указать, используете ли вы .NET Core или .NET Framework, поскольку .NET Core не поддерживает Ленивая загрузка.

Но я вижу, что @AliJP уже ответил на ваш вопрос.

Редактировать конец

Если вы хотите узнать больше об этой теме, попробуйте прочитать о Нетерпеливая загрузка и Ленивая загрузка.

У меня ошибка с надписью NullReferenceException: Object reference not set to an instance of an object.

jsonGPPD 10.09.2018 08:46

Я отредактировал свой пост, так как теперь вижу, что совершил ошибку.

Vlădel 10.09.2018 09:50

Другие вопросы по теме