实体框架中的多对多关系

时间:2019-03-14 19:27:34

标签: entity-framework linq join group-by

我从RegionsSubregions这两个表中获取数据。 Region可以有许多Subregions,由RegionID链接。

我想从数据库中返回所有Regions及其相关的Subregions

到目前为止,我已经做到了:

var RegionDet = (from s in context.Region
                 join b in context.SubRegion on s.RegionID equals b.RegionID
                 group b by s.RegionName into g
                 select new RegionsMV
                        {
                            RegionName = g.Key,
                            SubRegions = g.ToList()
                        }).ToList();

这很好用,除了它只会返回关联了Regions的{​​{1}}。如果Subregions没有Region,则不会返回。我尝试了不同的方法,但无法使其正常工作

2 个答案:

答案 0 :(得分:1)

为此您有不同的选择。袖手旁观,我可以想到这些:

a。从OP中的方法扩展手动联接

from s in context.Region
join b in context.SubRegion on s.RegionID equals b.RegionID into bg
from b in bg.DefaultIfEmpty()
group b by s.RegionName into g
select new RegionsMV
{
    RegionName = g.Key,
    SubRegions = g.ToList()
}

b。利用实体映射

public class Region 
{
    public int RegionID { get; set; }
    public string RegionName { get; set; }
    public ICollection<SubRegion> SubRegions { get; set; }
}

那么您的LINQ查询将是:

from s in context.Region.Include(r => r.SubRegions)
select new RegionsMV
{
    RegionName = s.RegionName,
    SubRegions = s.SubRegions
}

或者这是等效的:

context.Region.Include(r => r.SubRegions)
.Select(s => new RegionsMV()
{
    RegionName = s.RegionName,
    SubRegions = s.SubRegions
});

答案 1 :(得分:0)

这是如何获取所有Region和与这些Region相关联的子区域的方法。

List<Region> regions = context.Region.Include(r => r.SubRegions).ToList();

regions将包含所有地区。列表中的每个地区都会包含其子地区。