c# LINQ 返回所有连接的结果

标签 c# linq

我想从两个表的连接返回一个结果集。到目前为止,我已经加入了表格,但很难弄清楚最后一部分(或者可能整个事情都需要重新布线)。

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 行) - 做我需要先创建一些结合了 GameGameHasPlayer 的新模型/ 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)

这给了我实际结果,但只针对 gghp - 如果我尝试 select (g, ghp) 它只是没有打球!

最佳答案

您必须了解 C# 需要了解您返回的实例的结构。遗憾的是,简单地连接两个其他不相关的类不是一种选择。

幸运的是,这就是 select 语句为您提供的:一种动态创建匿名对象以存储在结果集中的方法。
select (g) 起作用是因为编译器知道 g 的类型。但是如果你想加入gghp,你需要构造一个新的类型:

select(r => new {
   Id = g.Id,
   GameId = ghd.GameId,
   // ...
})

关于c# LINQ 返回所有连接的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59099967/

相关文章:

c# - 在单元测试中循环不好?

c# - 使用 linq 合并集合

c# - LINQ Lambdas 何时在 foreach 循环中执行

c# - Linq2SQL生成的奇怪SQL

c# - 有没有办法导致传递给 Control.BeginInvoke 的委托(delegate)的类型推断?

c# - 保存文件时出现 UnauthorizedAccessException,但可以创建目录

c# - 使用 LINQ 更新数据表

c# - 使用 linq 检查列表计数是否一致

c# - Use C# to FTP file to mainframe including dataset - 将 FTP 脚本转换为 FtpWebRequest 代码

c# - 为什么 GetAttribute ("disabled") 返回 "true"而不是 "disabled"?