我想从两个表的连接返回一个结果集。到目前为止,我已经加入了表格,但很难弄清楚最后一部分(或者可能整个事情都需要重新布线)。
var x = _context.GameHasPlayers
.Join(_context.Games,
ghp => ghp.GameId,
g => g.Id,
(gameHasPlayer, game) => /*What goes here*/ );
在 SQL 中我会简单地这样写:
select * from GameHasPlayer ghp
join Game g on g.Id = ghp.GameId
假设这应该返回 2 个游戏,每个游戏有 2 个玩家,所以总共有四行。
如果我在我的 C# 查询的最后一行中使用,它就会运行:
(gameHasPlayer, game) => new Game { });
但我只得到四个(如预期的那样)新的空 Game
类,所以我正在努力解决如何返回整个结果集(即连接两个表的所有 4 行) - 做我需要先创建一些结合了 Game
和 GameHasPlayer
的新模型/ View 吗?
(例如,在 SQL 中,我可以创建一个 View 来实现上述 SQL 查询并返回一个通用数据集或重新创建 View C# 端?)
-----编辑-----
我也在下面尝试:
var x = from ghp in _context.GameHasPlayers
from g in _context.Games
where g.Id == ghp.GameId
select (g) // or select (ghp)
这给了我实际结果,但只针对 g
或 ghp
- 如果我尝试 select (g, ghp)
它只是没有打球!
最佳答案
您必须了解 C# 需要了解您返回的实例的结构。遗憾的是,简单地连接两个其他不相关的类不是一种选择。
幸运的是,这就是 select 语句为您提供的:一种动态创建匿名对象以存储在结果集中的方法。
select (g)
起作用是因为编译器知道 g 的类型。但是如果你想加入g
和ghp
,你需要构造一个新的类型:
select(r => new {
Id = g.Id,
GameId = ghd.GameId,
// ...
})
关于c# LINQ 返回所有连接的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59099967/