简体   繁体   中英

How to query many-to-many releationship in EF Core

I'm using .NET Core and EF Core for a web project. I'm struggling how to query a many-to-many releationship. This is what my models look like:

public class Begrip
{
    public int ID { get; set; }
    public string Name { get; set; } 
    public string Desc { get; set; }
    [Url]
    public string URL { get; set; } 
    public ICollection<BegripCategory> Categories { get; set; } 
}

public class Category
{
    public int ID { get; set; }
    public string Name { get; set; } 
    public ICollection<BegripCategory> Begrippen { get; set; }
}

public class BegripCategory
{
    public int begripId { get; set; }
    public Begrip begrip { get; set; } 
    public int categoryId { get; set; }
    public Category category { get; set; } 
}

EF Core won't load related properties automatically, so you'll need to explicitly do this, but something like the following should do the trick:

var result = context.Begrip
    .Include(x => x.Categories)
    .ThenInclude(x => x.category);

Note, intellisense doesn't always work on .ThenInclude at the moment, but the code should still compile even if it gets a red underline.

If you're returning this to the view or an API, you'll likely want to map it to a DTO so you don't have to deal with .Categories[0].category.Name etc.

If you need to filter a Many-to-Many relationship describe below I recomend to use a LinQ Enumerable Any method like this:

return result.Where(x => x.Categories.Any(c => c.category == categoryId));

To return a filtered list of entities related by a specific category.

EntityFrameworkCore Relationship query example

Extending @Richard's answer :

I noticed in Visual Studio 2017 15.5.6 when I do following:

            return _context.Begrip
            .Include(x => x.Categories)
                .ThenInclude(y => y.<nothing typed in here yet>)

IntelliSense at first tells me that y if of type ICollection of BegripCategory presenting methods suitable for collections what is confusing especially that when I start typing "category" (in place of "nothing typed in here yet") IntelliSense changes as if we were dealing with only a single instance instead of ICollection

Just a tiny remark, but I hope it will help to save a few minutes time confusion.

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