实体框架与过滤孙子(Entity Framework Filtering On GrandChild

2019-11-01 11:52发布

还是很新的实体框架。 所以请原谅我,如果这是一个小白的问题。 希望有人能在此提供一些线索。

我想从3个相关的表中的数据。

Leagues -> Teams -> Rosters -> 

的关系是League.LeagueID => Team.LeagueID => Roster.TeamID

名册中的桌子上有一个PlayerID

我需要一个查询,可以选择所有的联赛,其中名册PlayerID = 1

我似乎不能不管我怎么努力筛选的孙子创纪录的业绩。 没有找到太多的在互联网上无论是。

我已经找到一种方法与匿名类型要做到这一点,但那些是只读的,所以我可以修改数据。 我必须能够返回后更新数据。

Answer 1:

db.Leagues.Where(l => l.Teams.Any(t => t.Roster.PlayerID == 1));

生成的SQL应该得到你想要的东西,即使它看起来不可读;)

如果您想专门使用内部连接要做到这一点,你可以使用如下代码这样做:

from l in db.Leagues
join t in db.Teams on l.LeagueID equals t.LeagueID
join r in db.Rosters on t.TeamID equals r.TeamID
where r.PlayerID = 1
select l

UPDATE

要做到与预先加载的子关联使用Include()

((from l in db.Leagues
join t in db.Teams on l.LeagueID equals t.LeagueID
join r in db.Rosters on t.TeamID equals r.TeamID
where r.PlayerID = 1
select l) as ObjectQuery<League>).Include(l => l.Teams.Select(t => t.Rosters))


Answer 2:

db.Roasters.Where(r=>r.PlayerId ==1).Select(r=>r.Team).Select(t=>t.League).Distinct()

如果焙烧炉有许多团队和团队有很多的联赛,你可以使用.SelectMany代替.Select

的实施例.SelectMany从MSDN :

PetOwner[] petOwners = 
                    { new PetOwner { Name="Higa, Sidney", 
                          Pets = new List<string>{ "Scruffy", "Sam" } },
                      new PetOwner { Name="Ashkenazi, Ronen", 
                          Pets = new List<string>{ "Walker", "Sugar" } },
                      new PetOwner { Name="Price, Vernette", 
                          Pets = new List<string>{ "Scratches", "Diesel" } } };

                // Query using SelectMany().
                IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);


文章来源: Entity Framework Filtering On GrandChildren