Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架筛选孙子_C#_Frameworks_Entity - Fatal编程技术网

C# 实体框架筛选孙子

C# 实体框架筛选孙子,c#,frameworks,entity,C#,Frameworks,Entity,对实体框架来说还是很新的。所以,如果这是一个noob问题,请原谅我。希望有人能解释一下 我试图从3个相关表中选择数据 Leagues -> Teams -> Rosters -> 这些关系是League.LeagueID=>Team.LeagueID=>floster.TeamID 在花名册表中有一个PlayerID列 我需要一个查询,可以选择花名册上有PlayerID=1 无论我怎么做,我似乎都无法过滤孙子记录上的结果。在网上也找不到太多 我已经找到了一种方法来处理匿名类

对实体框架来说还是很新的。所以,如果这是一个noob问题,请原谅我。希望有人能解释一下

我试图从3个相关表中选择数据

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);