繁体   English   中英

在 LINQ 中结合连接和复杂选择

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM