【问题标题】:EF Core 5 filter Include and ThenIncludeEF Core 5 过滤器 Include 和 ThenInclude
【发布时间】:2021-04-21 07:16:58
【问题描述】:

我有以下用户认证功能:

internal static async Task<bool> AuthenticateUser(GameUser user, int userId, string token)
{
    await using var dbContext = new dabernaContext();

    var dbUser = await dbContext.Users

        // Referred users and their games
        .Include(u => u.InverseReferrerNavigation)
        .ThenInclude(u => u.GameUserLinks)
        .ThenInclude(gul => gul.Game)

        // User games
        .Include(u => u.GameUserLinks)
        .ThenInclude(gul => gul.Game)

        // User itself
        .FirstOrDefaultAsync(u => u.UserId == userId && u.Token == token)
        .ConfigureAwait(false);

    if (dbUser == null)
    {
        return false;
    }

    dbUser.LastLoginTime = DateTime.UtcNow;
    user.CachedGames = new List<Game>();
    user.CachedUserRefferals = new List<User>();

    var games = dbUser.GameUserLinks
        .Where(gul => (DateTime.UtcNow - gul.Game.StartTime).TotalDays <= 30)
        .Select(gul => gul.Game);

    foreach (var game in games)
    {
        user.CachedGames.Add(game);
    }

    foreach (var refferedUser in dbUser.InverseReferrerNavigation)
    {
        user.CachedUserRefferals.Add(refferedUser);
    }

    await dbContext.SaveChangesAsync().ConfigureAwait(false);

    return true;
}

我在这个函数中的目标是首先检查这个用户是否可以使用给定的令牌进行身份验证,然后获取他的游戏并将其添加到缓存变量中,然后对该用户引用的每个用户执行相同的操作(计算由每个被推荐的用户)

上面的代码未经测试,可能有效,但有两个问题:

  1. 查询未优化,它获取该用户引用的所有用户,然后在game_user_link 表中搜索,然后在game 表中进行另一次搜索。我想要的是只获取 game.StartTime 最多 30 天或更短时间之前的行。
  2. 我想要一种方法来计算过去一个月到现在为止的推荐用户游戏计数,而不是查询我不需要的行


如果性能需要,可以编辑数据库结构。

【问题讨论】:

  • 在这成为一个问题之前,您需要做一些工作。 “可能工作”是不够的。如果没有,我们就是在浪费时间。此外,展示一些初步的努力,以便我们看到您需要帮助的地方。从更广泛的角度来看,您应该考虑解开这种令人困惑的身份验证和业务逻辑组合。

标签: c# mysql .net-core entity-framework-core


【解决方案1】:
var period = DateTime.UtcNow.AddDays(-30);

//to get games only
var games= dbUser.GameUserLinks
       .Where(gul=>gul.StartTime<=period)
       .Select(gul=>gul.Game);

//You can minimize your code into:

var dbUser = await dbContext.Users
    // Referred users and their games
    .Include(u => u.InverseReferrerNavigation)
    .ThenInclude(u => u.GameUserLinks)
    .ThenInclude(gul => gul.Game)
    // User itself
    .FirstOrDefaultAsync(u => u.UserId == userId && u.Token == token && 
     u.Game.StartTime<=period)
    .ConfigureAwait(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2020-08-24
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2021-04-24
    相关资源
    最近更新 更多