简体   繁体   中英

Include all the properties from all the inherited classes using EF Core

When using EF6, I was using lazy loading so I never had this issue, but with EFCore, I don't know if this is possible with a single query.

I have the following class structure

class A { public B b; }
class B { public ICollection<C> list_c; }
class C { public ICollection<D> list_d; }
abstract class D { public long c_id; }
class Da { public E e; }
class Db { public F f; }

I need a list of all the D objects, but with access to their e and f properties respectively. I have a working query at the moment where I query _db.D over a list of c_id 's that I fetch using the first half of the query below, but with that approach, I send one query to get all the c_id 's and then one query per type (I have 4 types).

I was wondering if I can make it work with one call that looks something like this:

_db.As.Include(x => x.b)
      .ThenInclude(x => x.list_c)
      .ThenInclude(x => x.list_d)
      // some magic here
      .FirstOrDefaultAsync(x=> x.Id = model.Id);

EDIT:

At the moment this is how I make the list:

var a = await _db.As.Include(x => x.b)
                    .ThenInclude(x => x.list_c)
                    .FirstOrDefaultAsync(x=> x.Id = model.Id);

var result = await _db.Ds.OfType<Da>()
                         .Include(x=>x.e)
                         .Where(x=>a.b.list_c.Any(y=>y.Id == x.c_id))
                         .Select(x=>(D)x)
                   .Concat(_db.Ds.OfType<Db>()
                         .Include(x=>x.f)
                         .Where(x=>a.b.list_c.Any(y=>y.Id == x.c_id))
                         .Select(x=>(D)x)).
                   .ToListAsync();

I would advise against using Entity Framework Core if you have that option. Check the roadmap at https://github.com/aspnet/EntityFrameworkCore/wiki/Roadmap - It currently doesn't have lazy loading to name of its (very annoying) shortcomings.

You can have your data access layer in a .NET 4.6 project and have your consuming project(s), even if the consuming is based on Core, reference that project without difficulty.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM