C# 实体框架筛选孙子
对实体框架来说还是很新的。所以,如果这是一个noob问题,请原谅我。希望有人能解释一下 我试图从3个相关表中选择数据C# 实体框架筛选孙子,c#,frameworks,entity,C#,Frameworks,Entity,对实体框架来说还是很新的。所以,如果这是一个noob问题,请原谅我。希望有人能解释一下 我试图从3个相关表中选择数据 Leagues -> Teams -> Rosters -> 这些关系是League.LeagueID=>Team.LeagueID=>floster.TeamID 在花名册表中有一个PlayerID列 我需要一个查询,可以选择花名册上有PlayerID=1 无论我怎么做,我似乎都无法过滤孙子记录上的结果。在网上也找不到太多 我已经找到了一种方法来处理匿名类
Leagues -> Teams -> Rosters ->
这些关系是League.LeagueID=>Team.LeagueID=>floster.TeamID
在花名册表中有一个PlayerID
列
我需要一个查询,可以选择花名册上有PlayerID=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
更新
要处理子关联的即时加载,请使用Include()
:
((从数据库联盟中的l开始)
在db中加入t。l.LeagueID上的球队等于t.LeagueID
将r加入t.TeamID上的db.Rosters等于r.TeamID
其中r.PlayerID=1
选择l)作为ObjectQuery)。包括(l=>l.Teams.select(t=>t.Rosters))
如果Roaster有许多团队,并且团队有许多联盟,您可以使用。选择many
而不是。选择
示例。从以下位置选择多个:
PetOwner[]PetOwner=
{新宠物主人{Name=“Higa,Sidney”,
Pets=新列表{“邋遢”、“山姆”},
新宠物主人{Name=“德系犹太人,罗南”,
Pets=新列表{“Walker”,“Sugar”},
新宠物主人{Name=“Price,Vernette”,
Pets=新列表{“划痕”,“柴油机”}};
//使用SelectMany()进行查询。
IEnumerable query1=petOwner.SelectMany(petOwner=>petOwner.Pets);
这不太管用。当我查看sql时,它会创建左连接并返回太多的数据。也许我太简单了。我真正拥有的是4张桌子。父->子->孙辈->曾孙辈我想返回所有的父辈,但过滤子辈和曾孙辈。换句话说,从父内部联接子内部联接孙子内部联接孙子内部联接曾孙,其中Child.Column5=600和greatgrant.Column3=1000添加了另一个选项来执行您想要的查询,这对您有帮助吗?这似乎可行,但我有一个问题。如果我这样做foreach(l中的var-league){foreach(league.Teams中的var-team){foreach(team.Rosters中的var-lotster){}}}}这些内部循环中的每个都会调用数据库吗?我希望一次将所有这些数据带回来,以减少数据库访问。您需要的是所谓的急切加载-更新以包括这一点。使用即时加载,调用foreach
不会触发数据库命中,因为项目已加载到关联集合中。请考虑双重发布。这可能有效,但SelectMany有问题。您有示例吗?语法应该相同,请尝试。SelectMany代替。SelectMany仅在示例中用SelectMany替换SelectMany不起作用。编译错误可能意味着另一端没有多条记录。这是一个编译错误。如果不运行应用程序,编译器将无法避免另一端没有多条记录。
((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))
db.Roasters.Where(r=>r.PlayerId ==1).Select(r=>r.Team).Select(t=>t.League).Distinct()
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);