EF LINQ, birden çok ve iç içe öğeler içerir


155

Tamam, aşağıdaki hiyerarşiye sahip üç seviyeli varlıklarım var: Ders -> Modül -> Bölüm

İşte orijinal EF LINQ bildirimi:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters))
                .Single(x => x.Id == id); 

Şimdi Lab adında bir dersle ilişkili başka bir varlık eklemek istiyorum.

Laboratuar varlığını nasıl dahil edebilirim?

Aşağıdakileri denedim ama işe yaramadı:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
                .Single(x => x.Id == id); 

2. Varlığı dahil etme konusunda herhangi bir fikriniz var mı?

Herhangi bir tavsiye veya bilgi çok takdir edilecektir. Teşekkürler!


1
Başka bir .Includeeklenti, ek içermenin bir Torun torunu olduğu anlamına gelmedikçe işe yaramalıdır. Şuna bakın veya daha iyi bir seçenek bu
von v.

Yanıtlar:


234

Başka bir tane daha eklemeyi denediniz mi Include:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters))
                .Include(i => i.Lab)
                .Single(x => x.Id == id);

IncludeBoolean operatörünü almadığı için çözümünüz başarısız oluyor

Include(i => i.Modules.Select(s => s.Chapters) &&          i.Lab)
                           ^^^                  ^             ^ 
                          list           bool operator    other list

Güncelleme Daha fazla bilgi edinmek için LinqPad'i indirin ve örnekleri inceleyin. Linq ve Lambda'yı tanımanın en hızlı yolu olduğunu düşünüyorum.

Başlangıç olarak - farka arasında Selectve Includebir Seçenekli karar olduğunu Ne sen (projeksiyon aka) dönmek istiyorum. Include, Entity Framework'e diğer tablolardan veri eklemesini istediğinizi bildiren bir İstekli Yükleme işlevidir.

Include sözdizimi de dizede olabilir. Bunun gibi:

           db.Courses
            .Include("Module.Chapter")
            .Include("Lab")
            .Single(x => x.Id == id);

Ancak LinqPad'deki örnekler bunu daha iyi açıklıyor.


Teşekkür ederim! Bundan daha fazla bilgiyi nereden öğrenebilirim? Özellikle Include ve Select
AnimaSola

3
Sadece bu bir benim için çalıştı: .Include("Module.Chapter"). Bunun neden olduğu hakkında bir fikrin var mı?
Jo Smo

5
@JoSmo uzantı yöntemine System.Data.Enityerişmek için ad alanını içe aktarmanız gerekir . burada
Jens Kloster

using System.Data.Entity;yaptım. Teşekkürler!
Jo Smo

1
parlak linqpad bahsetti ve System.Data.Entity, thx Jens kullanmak için ipucu için oyladı
Mike

38

Entity Framework Core ( EF.core) içinde .ThenIncludesonraki seviyeleri eklemek için kullanabilirsiniz .

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
    .ToList();

Daha fazla bilgi: https://docs.microsoft.com/en-us/ef/core/querying/related-data

Not: De ki birden ihtiyaç ThenInclude()üzerine blog.Postssadece tekrarlayın Include(blog => blog.Posts)ve başka yapmak ThenInclude(post => post.Other).

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Other)
 .ToList();

EF.core'da yapamıyorum .Include (i => i.Modules.Select (s => s.Chapters)), özellikle .Select'in içinde .Include. Herkes onaylayabilir veya konuşabilir mi?
17'de

@ttugates Bu seçim ile ne yapmak istiyorsun? Bence yapmak istediğiniz şey ThenIncludeEF çekirdeğinde yaptığınız şey . Belki de iyi bir örnekle bir soru sorun, böylece cevaplayabiliriz.
Nick N.

@ Nick N - Entity Framework Linq Sorgusu: Birden Çok Gezinme Mülkünde Nereye Nasıl Gidilir ve 3. Gezinme Mülkünden Seçim Yapılır . Seçtiğim, eşleştiğim şey olmadığından, İçerilenler gerekli değildir, bu nedenle soru teğetseldir. Sorum çok "dar" olabilir ama herhangi bir yardım için teşekkür ederiz.
17'de

1
Ah. Aslında, .ThenInclude () çalışır. Intellisense'ın ilgili tabloları görüntülemesi sonsuza kadar sürer.
Chris J

23

Includeakıcı arayüzün bir parçasıdır, bu yüzden Includebirbirini takip eden birden fazla ifade yazabilirsiniz

 db.Courses.Include(i => i.Modules.Select(s => s.Chapters))
           .Include(i => i.Lab)
           .Single(x => x.Id == id); 

takdir ediyorum! beni bundan daha fazla öğrenebileceğim yere yönlendirebilir misin? Teşekkürler!
AnimaSola

1
Modüllerde katılmak istediğiniz birden çok tablo varsa sözdiziminin ne olduğunu biliyor musunuz? Bölümlerle ve başka bir şeyle bağlantılı olduğunu mu söylüyorsunuz?
David Spence

Akıcı .Net'in bir parçası mı yoksa kurulması gereken bir kütüphane mi?
codea

19

Ayrıca deneyebilirsiniz

db.Courses.Include("Modules.Chapters").Single(c => c.Id == id);

4
Teşekkürler - dizede nokta gösterimi çok yararlı
Evert

1
Bu yararlı olabilir, ancak bunu kullanmamanın bir nedeni daha sonra yeniden düzenleme kolaylığıdır: "Bölümler" varlığını bir noktada yeniden adlandırırsanız, diğer örnek otomatik olarak yeniden adlandırılır. Bir diğeri, hataların daha erken bulunacağıdır: derleme zamanında, çalışma zamanında değil.
MGOwen

2

Biri böyle bir uzantı yöntemi yazabilir:

    /// <summary>
    /// Includes an array of navigation properties for the specified query 
    /// </summary>
    /// <typeparam name="T">The type of the entity</typeparam>
    /// <param name="query">The query to include navigation properties for that</param>
    /// <param name="navProperties">The array of navigation properties to include</param>
    /// <returns></returns>
    public static IQueryable<T> Include<T>(this IQueryable<T> query, params string[] navProperties)
        where T : class
    {
        foreach (var navProperty in navProperties)
            query = query.Include(navProperty);

        return query;
    }

Ve genel bir uygulamada bile böyle kullanın:

string[] includedNavigationProperties = new string[] { "NavProp1.SubNavProp", "NavProp2" };

var query = context.Set<T>()
.Include(includedNavigationProperties);

Cevabınızı deniyordum, ama kendisi ile sonsuz bir döngü nedeniyle stackoverflowexceptions atıyor.
Victoria

1
@VictoriaS., Gerçekle karışmayacak şekilde uzatma yöntemini yeniden adlandırabilirsinizInclude
Mohsen Afshin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.