Получение значений из 3 моделей, где 1 модель является основным корнем, используя Lambda / Linq EF C # - PullRequest
0 голосов
/ 10 сентября 2018

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

Я пытаюсь получить данные из базы данных, используя 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 => ...

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

То, чего вы пытаетесь достичь, можно легко сделать с помощью Стремительная загрузка , о которой можно прочитать подробнее здесь или здесь . Ошибка, которую вы получаете, состоит в том, что вы не можете объединить 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 уже ответил на ваш вопрос.

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

Если вы хотите узнать больше об этой теме, попробуйте прочитать о Eager Loading и Lazy Loading .

0 голосов
/ 10 сентября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...