簡體   English   中英

EF Core 5 過濾器 Include 和 ThenInclude

[英]EF Core 5 filter Include and ThenInclude

我有以下 function 用於用戶身份驗證:

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;
}

我在這個 function 中的目標是首先檢查是否可以使用給定的令牌對這個用戶進行身份驗證,然后獲取他的游戲並將其添加到緩存變量中,然后對該用戶推薦的每個用戶執行相同操作(計算每個推薦用戶玩的游戲)

上面的代碼未經測試,可能有效,但有兩個問題:

  1. 該查詢未優化,它獲取該用戶引用的所有用戶,然后在game_user_link表中搜索,然后在game表中進行另一個搜索。 我想要的是只獲取game.StartTime最多 30 天前或更短的行。
  2. 我想要一種方法來計算過去一個月到現在為止的推薦用戶游戲計數,而不是查詢我的情況不需要的行

用戶游戲多對多鏈接
如果性能需要,可以編輯數據庫結構。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM