如何使用多个条件在数据库中选择一个条目?

时间:2019-01-30 18:59:10

标签: entity-framework c#-4.0

我正在做一个有趣的项目,我在为用户保存当前的GuildId,UserId,其级别和当前的Exp。它可以部分起作用,但似乎只能抓住一个条件的第一个结果。

我尝试了多种不同的方法来从数据库中选择项目,但是由于这是一种爱好,我觉得我缺少一些非常明显的东西。我已经记录了获取UserId和GuildId的方式,它们返回了正确的值。

如果不存在,它将当前添加一个新条目,并且将正确更新Xp,但仅更新一个条目。似乎会忽略GuildId,而只是找到与UserId匹配的第一个条目并将其保存在那里。

context.forward(key, value, To.all().withTimestamps())

我希望它将Xp保存到同时满足GuildId和UserId条件的条目。

1 个答案:

答案 0 :(得分:0)

您可以像这样稍微重构代码以使其更高效。您的代码确实可以执行您所描述的内容。如果只返回单个/空结果,则应使用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();
    }
}