[英]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 中的目標是首先檢查是否可以使用給定的令牌對這個用戶進行身份驗證,然后獲取他的游戲並將其添加到緩存變量中,然后對該用戶推薦的每個用戶執行相同操作(計算每個推薦用戶玩的游戲)
上面的代碼未經測試,可能有效,但有兩個問題:
game_user_link
表中搜索,然后在game
表中進行另一個搜索。 我想要的是只獲取game.StartTime
最多 30 天前或更短的行。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.