【发布时间】:2020-11-21 11:50:29
【问题描述】:
我正在后端使用 asp.net 核心构建一个视频观看应用程序,并且我创建了一个视图表,该表是用户和视频之间的多对多关系。 该表的示例是
userId | videoId
-------|--------
-------|--------
-------|--------
我正在尝试实施一个推荐部分,用户可以在其中看到他们没有看过的视频。 如果所有视频 id 都在视图表中,这很容易实现。 但是后来我想如果一个视频已经创建但没有人看过它,那么该视频的 id 不会出现在视图表中。 所以我的问题是如何查询数据库中用户没有观看视频的所有视频。 我设法想出的代码是
// user ---> the current user making the api call
var clips = new List<Domain.Clip>();
var notViewed = await _context.Views.Where(x => UserId != user.id).ToListAsync();
foreach (var view in notViewed)
{
clips.Add(await _context.Clips.SingleOrDefaultAsync(x => x.Id == view.ClipId && x.Game == game));
}
但这假设我的数据库中的所有视频都被观看了。 谁能帮我解决这个查询的结构?
【问题讨论】:
-
我已将您的
[asp.net-web-api](.NET Framework) 标记替换为 .NET Core 版本 ([asp.net-core-webapi])。如果更改不正确,请随时恢复更改。 -
您必须从
Clips表开始,并排除那些在Views中存在VideoId=ClipId 和UserId=当前用户的条目 -
@KlausGütter 对不起,我不太明白你的意思。能详细点吗?
-
怎么样:
var clipIdsTheUserWatched = _context.Views.Where(x => x.UserId = user.id).Select(x => x.videoId); var clipsTheUserDidntWatch = _context.Clips.Where(x => !(clipIdsTheUserWatched.Contains(x.Id)))?
标签: c# asp.net-core .net-core asp.net-core-webapi