Как выбрать запись в базе данных, используя несколько условий? - PullRequest
0 голосов
/ 30 января 2019

Я работаю над проектом для развлечения и сохраняю текущие GuildId, UserId пользователей, их уровень и текущий Exp.Это работает частично, но, кажется, просто захватывает первый результат только из одного условия.

Я пробовал несколько разных способов выбора элемента из базы данных, но, как мне кажется, это хобби, я 'Я упускаю что-то очень очевидное.Я зарегистрировал свои способы получения UserId и GuildId, и они возвращают правильные значения.

В настоящее время он добавляет новую запись, если она не существует, и будет корректно обновлять Xp, но только для одной записи.Кажется, он игнорирует GuildId и просто находит первую запись, соответствующую UserId, и сохраняет ее там.

    public static async Task SaveExp(ulong guildId, ulong userId, int level, uint xp, DateTime cooldown)
    {
        using (var dbContext = new DatabaseHandler())
        {
            if (dbContext.Exps.Any(x => x.GuildId == guildId && x.UserId == userId))
            {
                var current = dbContext.Exps.FirstOrDefault(x => x.GuildId == guildId && x.UserId == userId);
                if (current != null)
                {
                    current.Xp += xp;
                    current.Level += level;
                    dbContext.Exps.Update(current);
                }
            }
            else
            {
                dbContext.Exps.Add(new Exp
                {
                    GuildId = guildId,
                    UserId = userId,
                    Level = level,
                    Xp = xp,
                    Cooldown = cooldown
                });
            }
            await dbContext.SaveChangesAsync();
        }
    }

Я хочу сохранить Xp в записи, где соблюдаются критерии GuildId и UserId.

1 Ответ

0 голосов
/ 30 января 2019

Вы можете немного реорганизовать свой код, чтобы сделать его более эффективным.Ваш код делает то, что вы описываете, хотя.Если вам когда-либо нужно возвращать только один / нулевой результат, тогда вы должны использовать SingleOrDefault / SingleOrDefaultAsync, что гарантирует, что при большем количестве результатов будет InvalidOperationException.

public static async Task SaveExp(ulong guildId, ulong userId, int level, uint xp, DateTime cooldown)
{
    using (var dbContext = new DatabaseHandler())
    {
        var current = await dbContext.Exps.FirstOrDefaultAsync(x => x.GuildId == guildId && x.UserId == userId);
        if (current != null)
        {
            current.Xp += xp;
            current.Level += level;
            // you should not need this next line in EF6
            // the entity is already attached as you just retrieved it and should be tracked
            dbContext.Exps.Update(current);
        }
        else
        {
            dbContext.Exps.Add(new Exp
            {
                GuildId = guildId,
                UserId = userId,
                Level = level,
                Xp = xp,
                Cooldown = cooldown
            });
        }
        await dbContext.SaveChangesAsync();
    }
}
...