Entity Framework-zawiera wiele poziomów właściwości

Metoda Include() działa całkiem dobrze dla list na obiektach. Ale co, jeśli muszę przejść dwa poziomy głęboko? Na przykład, metoda poniżej zwróci ApplicationServers z dołączonymi właściwościami pokazanymi tutaj. Jednak ApplicationsWithOverrideGroup jest kolejnym kontenerem, który przechowuje inne złożone obiekty. Czy Mogę zrobić Include() również na tej właściwości? Lub jak Mogę uzyskać tę właściwość, aby w pełni załadować?

W obecnej formie metoda ta:

public IEnumerable<ApplicationServer> GetAll()
{
    return this.Database.ApplicationServers
        .Include(x => x.ApplicationsWithOverrideGroup)                
        .Include(x => x.ApplicationWithGroupToForceInstallList)
        .Include(x => x.CustomVariableGroups)                
        .ToList();
}

Będzie wypełniać tylko Właściwość Enabled (poniżej), a nie Właściwości aplikacji lub CustomVariableGroup (poniżej). Jak to zrobić?

public class ApplicationWithOverrideVariableGroup : EntityBase
{
    public bool Enabled { get; set; }
    public Application Application { get; set; }
    public CustomVariableGroup CustomVariableGroup { get; set; }
}
Author: Bob Horn, 2012-05-30

7 answers

Dla EF 6

using System.Data.Entity;

query.Include(x => x.Collection.Select(y => y.Property))

Zobacz Uwagi aby uzyskać więcej przykładów.

Upewnij się, że dodałeś using System.Data.Entity;, aby uzyskać wersję Include, która zajmuje lambda.


Jeśli używasz EF Core możesz użyć nowej metody ThenInclude

query.Include(x => x.Collection)
     .ThenInclude(x => x.Property);
 500
Author: Equiso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 20:59:02

Jeśli dobrze cię rozumiem, pytasz o włączenie właściwości zagnieżdżonych. Jeżeli tak :

.Include(x => x.ApplicationsWithOverrideGroup.NestedProp)

Lub

.Include("ApplicationsWithOverrideGroup.NestedProp")  

Lub

.Include($"{nameof(ApplicationsWithOverrideGroup)}.{nameof(NestedProp)}")  
 52
Author: Judo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-06 14:47:04

EF Core: Using "ThenInclude" to load mutiple levels: Na przykład:

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
        .ThenInclude(author => author.Photo)
    .ToList();
 32
Author: thangcao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 13:48:17

Zrobiłem mały helper dla encji Framework 6 (. Net core style), aby w przyjemny sposób zawierać pod-encje.

Jest teraz na NuGet: Install-Package ThenInclude.EF6

using System.Data.Entity;

var thenInclude = context.One.Include(x => x.Twoes)
    .ThenInclude(x=> x.Threes)
    .ThenInclude(x=> x.Fours)
    .ThenInclude(x=> x.Fives)
    .ThenInclude(x => x.Sixes)
    .Include(x=> x.Other)
    .ToList();

Pakiet jest dostępny na GitHub .

 19
Author: Lenny32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 14:09:21

Musiałem również użyć wielu includów i na 3 poziomie potrzebowałem wielu właściwości

(from e in context.JobCategorySet
                      where e.Id == id &&
                            e.AgencyId == agencyId
                      select e)
                      .Include(x => x.JobCategorySkillDetails)
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.DurationType))
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.RuleType))
                      .Include(x => x.Shifts.Select(r => r.Rate).Select(rt => rt.RateType))
                      .FirstOrDefaultAsync();

To może komuś pomóc:)

 13
Author: dnxit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-17 12:56:57

Więcej przykładów EFCore na MSDN pokazuje, że można zrobić kilka dość złożonych rzeczy z Include i ThenInclude.

Jest to dobry przykład tego, jak skomplikowane można uzyskać (to wszystko jest jednym stwierdzeniem!):

viewModel.Instructors = await _context.Instructors

      .Include(i => i.OfficeAssignment)

      .Include(i => i.CourseAssignments)
        .ThenInclude(i => i.Course)
            .ThenInclude(i => i.Enrollments)
                .ThenInclude(i => i.Student)

      .Include(i => i.CourseAssignments)
        .ThenInclude(i => i.Course)
            .ThenInclude(i => i.Department)

      .AsNoTracking()
      .OrderBy(i => i.LastName)
      .ToListAsync();

Zobacz, jak możesz połączyć Include nawet po ThenInclude i to jakby "resetuje" cię z powrotem do poziomu jednostki najwyższego poziomu (instruktorów).

Możesz nawet wielokrotnie powtarzać tę samą kolekcję "pierwszego poziomu" (CourseAssignments), po której następują osobne polecenia ThenIncludes aby dostać się do różnych jednostek dziecka.

Uwaga twoje rzeczywiste zapytanie musi być oznaczone na końcu łańcucha Include lub ThenIncludes. Nie działa:

var query = _context.Instructors.AsQueryable();
query.Include(i => i.OfficeAssignment);

var first10Instructors = query.Take(10).ToArray();

Zdecydowanie zalecamy skonfigurowanie logowania i upewnienie się, że Twoje zapytania nie wymykają się spod kontroli, jeśli uwzględniasz więcej niż jedną lub dwie rzeczy. Ważne jest, aby zobaczyć, jak to faktycznie działa - i zauważysz, że każde oddzielne "Dołącz" jest zwykle nowym zapytaniem, aby uniknąć masowych połączeń zwracających zbędne data.

AsNoTracking może znacznie przyspieszyć działanie, jeśli nie zamierzasz faktycznie edytować podmiotów i zapisywać ponownie.

 7
Author: Simon_Weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-16 08:48:42

Pozwól, że powiem jasno, że możesz użyć przeciążenia łańcuchów do włączenia zagnieżdżonych poziomów niezależnie od wielokrotności odpowiednich relacji, jeśli nie masz nic przeciwko użyciu literałów łańcuchowych:

query.Include("Collection.Property")
 0
Author: mrmashal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-29 05:32:36