【问题标题】:Getting a list of entities in c#在 C# 中获取实体列表
【发布时间】: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 =&gt; x.UserId = user.id).Select(x =&gt; x.videoId); var clipsTheUserDidntWatch = _context.Clips.Where(x =&gt; !(clipIdsTheUserWatched.Contains(x.Id)))

标签: c# asp.net-core .net-core asp.net-core-webapi


【解决方案1】:

这更像是一个“架构”问题,但您可以在 Clips 表中记录“观看次数” - 每次有人观看视频时。这就像向 Clip 添加一个整数字段一样简单 - 例如 Clip.WatchCount。

然后查询 0 次观看的视频就变得非常容易了:

_context.Clips.Where(c => c.WatchCount == 0);

【讨论】:

  • smart... 但@coraks 解决方案似乎更适合我的用例。感谢您的帮助。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多