【问题标题】:Entity Framework fetch Top 10 rows实体框架获取前 10 行
【发布时间】:2013-07-05 16:16:37
【问题描述】:

我在 SQL 数据库中有 3 个表

tblVideos

VideoID     int PK
Title       varchar(100)
Decription  varchar(100)

tblTags

TagID       int PK
TagText     varchar(100)

tblVideosToTags

VideoID     int PK, FK to Videos
TagID       int PK, FK to Tags

在实体框架(v6-latest-nightly-build)中,我有 2 个类 VideoTag 具有多对多关系。我需要帮助来构建满足以下条件的 LINQ to Entities 或 LINQ to SQL 查询:

标签中的前 10 条记录,这是最常用的。所以可能需要一些求和/计数/分组

【问题讨论】:

  • 到目前为止您创建的查询是什么?
  • 其实我一开始就卡住了:db.Tags.Include(x => x.Videos).OrderBy(...这里我需要一些想法
  • Linq-to-SQL 是一个不同的简单 ORM - 所以你是 either 使用实体框架 (那么您将编写 Linq-to-Entities 查询),OR 您正在使用 Linq-to-SQL - 但它们是完全独立的两段不同的代码

标签: asp.net-mvc entity-framework linq-to-sql linq-to-entities


【解决方案1】:

如果您想找到标签数量最多的前 10 个视频,您可能会发现它更容易,但实际上您现在要做的完全一样。您只需要视频数量最多的前 10 个标签。使用这个:

var mostUsedTags = db.Tags.OrderByDescending(t => t.Videos.Count).Take(10);

【讨论】:

  • 再问一次。如果我想将 lang 列添加到 Videos 表并想要做同样的事情,但要按语言过滤(从指定语言的视频中获取前 10 个最常用的标签),该怎么办?类似于: var mostUsedTags = db.Tags.OrderByDescending(t => t.Videos.Where(l => l.Lang == lang).Count).Take(10);但是这种结构不起作用
  • 使用这个:db.Tags.OrderByDescending(t => t.Videos.Count(v => v.Lang == lang)).Take(10);
  • 您好 ataravati,再次需要您的帮助。尝试获取最近 3 个上传视频的标签,但没有成功...
  • 假设 VideoID 是自动生成的 ID,则最后上传的视频是 VideoID 最大的视频。所以,这就是你需要做的:var tags = db.Videos.OrderByDescending(v => v.VideoID).Take(3).Select(v => v.Tags).SelectMany(t => t).Distinct(); 你需要使用 Distinct() 去除重复的标签。
  • 而且,您使用 SelectMany 将 IEnumerable 展平为 T。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多