[英]linq query with join returning incorrect values/associations
我有一个梦幻足球网站,在一个页面上我让用户选择最多5个玩家进行比较(在这个例子中,我使用了Peyton Manning,Aaron Rodgers和Andrew Luck)。 我运行以下查询以返回这些玩家的所有逐周数据:
var weekStats = from p in db.Players
join t in db.Teams on p.teamAbbre equals t.teamAbbre
join w in db.WeekStats on p.playerId equals w.playerId
where (p.playerId == player0 || p.playerId == player1 || p.playerId == player2 || p.playerId == player3 || p.playerId == player4)
&& w.season == 2014
select new PlayerIndexViewModel
{
player = p,
team = t,
weekStat = w
};
首先看,一切看起来都很棒,每个玩家可获得16个结果。 但是,我看得更近,我看到它只返回Peyton所有三名球员的统计数据! (现在,大多数球员都不会抱怨获得Peyton的统计数据,但这不是我想的......)
我双重/三重检查,数据库中的一切都是正确的。 以下sql完美运行:
select p.*, t.*, w.* from Player p
join Team t on t.teamAbbre = p.teamAbbre
join WeekStat w on w.playerId = p.playerId
where
w.season = 2014
and (p.playerId = 2501863 or p.playerId = 2506363 or p.playerId = 2533031 or p.playerId = -1 or p.playerId = -1)
注意:在这个例子中我们只选择了3个玩家,所以-1只是假人。
在做了一些搜索后,我读到了关于“导航”作为连接的替代方法,并尝试了以下但得到了相同的结果:
var weekStats2 = from w in db.WeekStats
where (w.playerId == player0 || w.playerId == player1 || w.playerId == player2 || w.playerId == player3 || w.playerId == player4)
&& w.season == 2014
select new PlayerIndexViewModel
{
player = w.player,
team = w.player.Team,
weekStat = w
};
我还添加了一行,我专门查看一个stat,看看发生了什么:
var weekStats2 = from w in db.WeekStats
where (w.playerId == player0 || w.playerId == player1 || w.playerId == player2 || w.playerId == player3 || w.playerId == player4)
&& w.season == 2014
select new PlayerIndexViewModel
{
player = w.player,
team = w.player.Team,
weekStat = w,
statCat_5 = w.statCat_5
};
当我运行并逐步通过调试器时,我发现statCat_5对于每个玩家都是正确的,但是weekStat中的值仍然与Peyton的统计数据重复。 同样奇怪的是,Rodgers和Luck的正确一周缺失(意味着3名球员中的每一个都有不同的再见周,因此数据中缺少相关的一周)。
我想我的问题是:我疯了吗? 我的LINQ有什么问题导致这种奇怪?
-----------编辑这是根据调试器运行的sql:
{SELECT
[Extent1].[season] AS [season],
[Extent2].[playerId] AS [playerId],
[Extent2].[playerName] AS [playerName],
[Extent2].[teamAbbre] AS [teamAbbre],
[Extent2].[position] AS [position],
[Extent3].[teamAbbre] AS [teamAbbre1],
[Extent3].[geoName] AS [geoName],
[Extent3].[teamName] AS [teamName],
[Extent3].[conference] AS [conference],
[Extent3].[division] AS [division],
[Extent3].[imageURL] AS [imageURL],
[Extent1].[weekNum] AS [weekNum],
[Extent1].[playerId] AS [playerId1],
[Extent1].[statCat_1] AS [statCat_1],
[Extent1].[statCat_2] AS [statCat_2],
[Extent1].[statCat_3] AS [statCat_3],
[Extent1].[statCat_4] AS [statCat_4],
[Extent1].[statCat_5] AS [statCat_5],
.....
[Extent1].[statCat_90] AS [statCat_90],
[Extent1].[statCat_91] AS [statCat_91]
FROM [dbo].[WeekStat] AS [Extent1]
INNER JOIN [dbo].[Player] AS [Extent2] ON [Extent1].[playerId] = [Extent2]. [playerId]
LEFT OUTER JOIN [dbo].[Team] AS [Extent3] ON [Extent2].[teamAbbre] = [Extent3].[teamAbbre]
WHERE (2014 = [Extent1].[season]) AND ([Extent1].[playerId] IN (@p__linq__0,@p__linq__1,@p__linq__2,@p__linq__3,@p__linq__4))}
当我将其粘贴到sql server中时,它运行正常(各个玩家获得自己的统计数据而不仅仅是Peyton统计数据的副本)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.