【问题标题】:Get List ordered by number of records from another table using Linq使用Linq从另一个表中获取按记录数排序的列表
【发布时间】:2017-04-28 00:59:42
【问题描述】:

我正在使用 EF6,并创建了这两个模型:

public class Publication
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}

public class ViewLog
{
    public int Id { get; set; }
    public int? UserId { get; set; }
    [ForeignKey("UserId")]
    public User.User User { get; set; }
    public int? SessionId { get; set; }
    [ForeignKey("SessionId")]
    public User.Session Session { get; set; }
    public int PublicationId { get; set; }
    [ForeignKey("PublicationId")]
    public Publication.Publication Publication { get; set; }
    public DateTime Created { get; set; }
}

每次访问出版物时,我都会在 ViewLog 表中创建一条新记录。 现在,使用 Linq,我需要按过去 24 小时内每个出版物的 ViewLogs(访问)数量排序所有出版物。 (如果 Publication 没有 ViewLogs,它们也需要出现,但显然在具有 viewlogs 的发布之后)

【问题讨论】:

  • 你有什么尝试吗?你可以试试Left JoinGroup BYHaving Count
  • 是的,我知道如何用 SQL 来获得这个,但我在 Linq 中找不到类似的东西。

标签: c# asp.net entity-framework linq lambda


【解决方案1】:

当您没有导航属性并且需要左外连接时,您可以使用GroupJoin

lambda 语法是这样的:

var publicationQuery = new List<Publication>().AsQueryable();
var viewLogQuery = new List<ViewLog>().AsQueryable();

var leftJoinQuery = publicationQuery
    .GroupJoin(viewLogQuery, x => x.Id, x => x.PublicationId, (pub, logs) => new
    {
        PublicationId = pub.Id,
        LogCount = logs.Count()
    })
    .OrderByDescending(x => x.LogCount);

我还发现这个Query Expression Translation Cheat Sheet 对于从查询表达式(更接近 SQL)到 lambda 方法语法(我更喜欢)非常有用

如果您确实有导航属性 Publication.ViewLogs(即 List&lt;ViewLog&gt;),那么您可以将 Select() 与投影一起使用

var publicationQuery = new List<Publication>().AsQueryable(); // From a DbSet...

var query = publicationQuery
    .Select(x => new
    {
        PublicationId = x.Id,
        LogCount = x.ViewLogs.Count
    })
    .OrderByDescending(x => x.LogCount);

【讨论】:

  • Andrés,如果我创建一个导航属性,例如在 Publications 中创建一个 ViewLogs 列表,会更容易吗? (我已经将发布 ID 放入 ViewLog)。您能否也发布一个这种情况的例子?非常感谢!!
  • 更新了我的答案...不确定您是否还有其他未反映在问题中的要求...
猜你喜欢
  • 2011-10-13
  • 2011-09-13
  • 1970-01-01
  • 2018-12-08
  • 2014-03-23
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多