C# 使用Linq从另一个表中获取按记录数排序的列表

C# 使用Linq从另一个表中获取按记录数排序的列表,c#,asp.net,entity-framework,linq,lambda,C#,Asp.net,Entity Framework,Linq,Lambda,我使用的是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

我使用的是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; }
}
公共类发布
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表产品{get;set;}
}
公共类视图日志
{
公共int Id{get;set;}
public int?UserId{get;set;}
[外键(“用户ID”)]
公共用户。用户用户{get;set;}
public int?SessionId{get;set;}
[外键(“SessionId”)]
公共用户.Session会话{get;set;}
public int PublicationId{get;set;}
[ForeignKey(“PublicationId”)]
公共发布。发布发布{get;set;}
已创建公共日期时间{get;set;}
}
每次访问出版物时,我都会在ViewLog表中创建一条新记录。
现在,使用Linq,我需要按照过去24小时内每个出版物的查看日志(访问)数量获取所有出版物的订单。(如果出版物没有ViewLogs,它们也需要出现,但显然是在有ViewLogs的出版物之后)

当您没有导航属性并且需要左外部联接时,可以使用
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);

你试过什么吗?您可以尝试使用
groupby
Having Count
进行
Left Join
。是的,我知道如何使用SQL实现这一点,但我在Linq.Andrés中找不到类似的功能,如果我创建一个导航属性,例如在出版物中创建一个ViewLogs列表,这会更简单吗?(我已将出版物Id输入到ViewLog中)。你能不能也发一个这种情况的例子?非常感谢你!!更新了我的答案。。。不确定您是否有问题中未反映的任何其他要求。。。
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);