C# 使用Linq从另一个表中获取按记录数排序的列表
我使用的是EF6,我创建了这两个模型: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
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);