Как получить все данные из EF Core многие ко многим - PullRequest
0 голосов
/ 22 мая 2019

В ядре EF есть две таблицы (Страница, Группа), которые имеют отношения многие ко многим с соединительной таблицей GroupPage .Хотите получить данные всех страниц с данными таблицы соединений на основе groupId, как показано ниже.

enter image description here

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Следующий синтаксис является информативным. Вот структура сущностей и страница Dto.

public class Page
{
    public int Id { get; set; }
    public ICollection<Group> Groups { get; set; }
    ...
}

public class Group
{
    public int Id { get; set; }
    public ICollection<Page> Pages { get; set; }
    ...
}


public class PageGroup
{
    public int PageId { get; set; }
    public Page Page { get; set; }
    public int GroupId { get; set; }
    public Group Group { get; set; }   
}


public class PagesDto 
{
    public string Name { get; set; }
    public int GroupId { get; set; }
    public int PageId { get; set; }
    public string Description { get; set; }
    public string Tab { get; set; }
    public string Module { get; set; }
    public bool? IsActive { get; set; }
    public bool? IsDefault { get; set; }

    public PagesDto()
    {
        IsActive = false;
        IsDefault = false;
    }
}

Следующая функция помогает нам получать информацию о группах страниц.

public async Task<List<PagesDto>> GetAllPagesByGroupId(int selectedGroupId)
{
    //get all pages
    var pages = await _pagesRepository.GetAll().Select(p => new PagesDto {
        PageId = p.Id,
        Name = p.Name,
        GroupId = 0

    }).ToListAsync();

    //get group ralated pages
    var selectedGroupPageIds = _groupPagesRepository
        .GetAll()
        .Where(p => p.GroupId == selectedGroupId)
        .Select(p => p.PageId);

    //update page information base on group related pages info.
    foreach (var item in pages.Where(p=>selectedGroupPageIds.Contains(p.PageId)))
    {
        item.GroupId = selectedGroupId;                
    }

    return pages;

}
0 голосов
/ 22 мая 2019

Если вы правильно строите свое отношение EF, у вас не должно быть сущности GroupPage.

См. База данных Entity Framework. Сначала многие-ко-многим о том, как правильно построить EF EDM..

Как только вы правильно сопоставили свой EDM, у вас должны быть классы

public class Page
{
    public int Id { get; set; }
    public ICollection<Group> Groups { get; set; }
    ...
}

public class Group
{
    public int Id { get; set; }
    public ICollection<Page> Pages { get; set; }
    ...
}

Тогда вам нужно просто сделать следующее

public IQueryable<Page> GetPages(int groupId)
{
    return from group in _context.Groups
           where group.Id == groupId
           from page in group.Pages
           select page;
}
...