Объединение объединения и сложного выбора в LINQ - PullRequest
0 голосов
/ 24 марта 2020

Я совершенно новичок в использовании LINQ и C# в целом, и пытаюсь изменить существующий API из узла / express, чтобы узнать, как он работает (мой первый проект в C#).

Мне кажется, я нашел ответы на этот вопрос, который мне трудно понять, потому что я использую лямбда-функции, а эти ответы, по большому счету, нет. Этот запрос был полностью функциональным, прежде чем я начал расширять его, чтобы добавить объединение (например, все из части 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)

1 Ответ

0 голосов
/ 24 марта 2020

Третий параметр 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;
        }

Так что следующий Где взять типы PitchingSeason и отфильтровать их Season, Ip, TeamId.

Редактировать: в связанном примере вы видите анонимный тип . Вы также можете использовать его, но вам нужно изменить Where, а не obj.TeamId, у вас будет obj.Team.TeamId, если вы создадите новый тип с new {Pitching = pitching, Team = team}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...