Как включить() вложенный дочерний объект в linq

Как включить ребенка в дочернюю организацию?

Т.е., у Джобс есть котировки, у которых есть QuoteItems

var job = db.Jobs
            .Where(x => x.JobID == id)
            .Include(x => x.Quotes)
            .Include(x => x.Quotes.QuoteItems) // This doesn't work
            .SingleOrDefault();

Чтобы быть более ясным - я пытаюсь получить один элемент Job, а также связанные с ним Quotes (один для многих) и для каждой Цитаты связанные QuoteItems (у одной цитаты может быть много QuoteItems)

Причина, по которой я спрашиваю, заключается в том, что в моем представлении индекса котировок я пытаюсь показать общее количество всех позиций котировок для каждой цитаты с помощью SUMming в итоговом выражении, но это выглядит как 0. Я называю "Итого" следующим образом:

@item.QuoteItem.Sum(p => p.Subtotal)

Я считаю, что причина, по которой у меня возникает эта проблема, заключается в том, что мой запрос Linq выше не извлекает связанные QuoteItems для каждой Цитаты.

Ответы

Ответ 1

Чтобы получить работу и стремиться загрузить все ее цитаты и их цитаты, вы пишете:

var job = db.Jobs
        .Include(x => x.Quotes.Select(q => q.QuoteItems))
        .Where(x => x.JobID == id)
        .SingleOrDefault();

Вам может потребоваться SelectMany вместо Select если QuoteItems также является коллекцией.

Примечание для других; Строго типизированный метод Include() является методом расширения, поэтому его необходимо включить using System.Data.Entity; в верхней части вашего файла.

Ответ 2

Это выполнит работу (учитывая, что мы говорим о структуре сущностей и вы хотите получить дочерние сущности):

var job = db.Jobs
            .Include(x => x.Quotes) // include the "Job.Quotes" relation and data
            .Include("Quotes.QuoteItems") // include the "Job.Quotes.QuoteItems" relation with data
            .Where(x => x.JobID == id) // going on the original Job.JobID
            .SingleOrDefault(); // fetches the first hit from db.

Для получения дополнительной информации об операторе Include посмотрите следующее: http://msdn.microsoft.com/en-us/library/bb738708(v=vs.110).aspx

Этот ответ на протяжении многих лет вызывал отклики, поэтому я просто хотел бы уточнить, попробуйте сначала fooobar.com/questions/8602718/.... Этот ответ предназначен для тех случаев, когда все остальное терпит неудачу, и вам приходится прибегать к решению черной магии (то есть, используя магические строки).

Ответ 3

Это помогло, как сказал здесь @Флиндеберг. Просто добавлена проверка, есть ли дети в каждом родительском элементе в списке

 List<WCF.DAL.Company> companies = dbCtx.Companies.Where(x=>x.CompanyBranches.Count > 0)
                            .Include(c => c.CompanyBranches)
                            .Include("CompanyBranches.Address")
                            .ToList();

Ответ 4

Метод в принятом ответе не работает в .NET Core.

Для тех, кто использует .NET Core, хотя способ магической струны работает, более чистый способ сделать это будет ThenInclude:

var job = db.Jobs
        .Where(x => x.JobID == id)
        .Include(x => x.Quotes)
        .ThenInclude(x => x.QuoteItems)
        .SingleOrDefault();

(источник)