Как включить() вложенный дочерний объект в 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();
(источник)