[英]Combining a join and a complex select in LINQ
一般来说,我对使用 LINQ 和 C# 还很陌生,我正在尝试重构 node/express 中的现有 API 以了解它是如何工作的(我的第一个 C# 项目)。
我相信我已经找到了我很难理解的这个问题的答案,因为我使用的是 lambda 函数,而这些答案总的来说不是。 在我开始扩展它以添加连接之前,此查询功能齐全(例如,来自 where/orderby 部分的所有内容)
public async Task<ActionResult<IEnumerable<PitchingSeason>>> GetSeasonPitching(
[FromQuery] int season, [FromQuery] string? team, [FromQuery] int ip = 1)
{
var query = await _context.Masterpitching
.Join(_context.Teams,
pitching => pitching.TeamId,
team => team.TeamId,
(pitching, team) =>{??}) <-- not sure what to do here
.Select(obj => new PitchingSeason()) <-- or how to use the class here
.Where(
obj => obj.Season == season
&& obj.Ip > ip
&& (team == null || obj.TeamId == team))
.OrderBy(obj => obj.Fip)
.ToListAsync();
return query;
}
为了比较,这里是我试图从 node.pg 复制的查询。 PitchingSeason 类包含我在此查询中选择的所有键。 连接的最终语句以及如何使用类进行选择是我陷入困境的地方
pool.query(`SELECT p.gidp,p.player,p.np,p.season,p.sho,p.bk,p.sv,p.bb,p.so,p.wp,p.hb,
p.rs,p.l,p.cg,p.player_id,p.gs,p.ibb,p.team_id,p.hr,p.era,p.fip,
p.hld,p.g,p.ip,p.w,p.r,p.er,t.name_abbrev,t.league_abbrev,t.name
FROM "${season}pitching" AS p INNER JOIN teams AS t ON p.team_id = t.team_id
WHERE p.ip > $1 ORDER BY fip ASC`, search)
Join 的第三个参数是一个函数,它用两个连接的项目创建一个新对象。 您可以在此处查看示例。
您可能想要在这里做的是在问号所在的位置创建 PitchingSeason:
public async Task<ActionResult<IEnumerable<PitchingSeason>>> GetSeasonPitching(
[FromQuery] int season, [FromQuery] string? team, [FromQuery] int ip = 1)
{
var query = await _context.Masterpitching
.Join(_context.Teams,
pitching => pitching.TeamId,
team => team.TeamId,
(pitching, team) => new PitchingSeason(/*Fill PitchingSeason from pitching and team*/))
.Where(
obj => obj.Season == season
&& obj.Ip > ip
&& (team == null || obj.TeamId == team))
.OrderBy(obj => obj.Fip)
.ToListAsync();
return query;
}
所以下一个 Where 将获得 PitchingSeason 类型,并过滤他们的 Season、Ip、TeamId。
编辑:您在链接示例中看到的是一个匿名类型。 您也可以使用它,但您需要更改 Where,而不是 obj.TeamId,您将拥有 obj.Team.TeamId,假设您使用new {Pitching = pitching, Team = team}
创建一个新类型
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.