gpt4 book ai didi

c# - 带连接的 linq 查询返回不正确的值/关联

转载 作者:行者123 更新时间:2023-11-30 18:24:46 27 4
gpt4 key购买 nike

我有一个梦幻足球网站,在一个页面上,我让用户选择最多 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 统计数据! (现在,大多数球员不会提示获得佩顿的数据,但我想这不是重点……)

我双重/三次检查,数据库中的一切都是正确的。以下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

};

我还添加了一行,专门查看一个统计数据以了解发生了什么:

    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 的统计数据重复。同样奇怪的是,罗杰斯和拉克的正确周数丢失了(这意味着这 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 统计数据的副本)。

最佳答案

由于 SQL 返回了预期的结果而 C# 代码没有,看起来问题与 JOIN 本身无关。

它看起来更像是一个“值(value)与引用”的问题。为每个玩家创建了一个新的 PlayerIndexViewModel 实例,但它们引用了一个 Weekstats 实例,并且根据结果判断它可能是所有行上的同一个实例。

要检查这是否是问题所在,请尝试为 weekStat 分配 w 的克隆而不是 w 本身(假设 WeekStats 是可克隆的)。

我不知道为什么这个问题对 WeekStats 的影响比对 Players 或 Teams 的影响更大(从第一个代码片段开始);答案可能在于类绑定(bind)到表的方式。

回答了一个关于类似问题的问题here

关于c# - 带连接的 linq 查询返回不正确的值/关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30875534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com