Asp.net mvc 创建按日期排序的事件提要
我正在尝试在用户页面上创建一个提要,如果用户最近喜欢某个东西、创建了一个项目、对一篇文章发表了评论等,它将在其中显示。我将如何做到这一点?我想把从数据库中获得的不同信息列成一个对象列表,然后按日期排序,但我无法正确地排序代码。怎么样:Asp.net mvc 创建按日期排序的事件提要,asp.net-mvc,linq,Asp.net Mvc,Linq,我正在尝试在用户页面上创建一个提要,如果用户最近喜欢某个东西、创建了一个项目、对一篇文章发表了评论等,它将在其中显示。我将如何做到这一点?我想把从数据库中获得的不同信息列成一个对象列表,然后按日期排序,但我无法正确地排序代码。怎么样: var feed = db.Likes .Where(like => like.UserID == currentUserID) .Where(like => like.CreatedAt > createdSince)
var feed = db.Likes
.Where(like => like.UserID == currentUserID)
.Where(like => like.CreatedAt > createdSince)
.OrderByDescending(like => like.CreatedAt)
.Select(like => new {
Type = "like",
CreatedAt = like.CreatedAt
})
.Concat(db.Comments
.Where(comment => comment.UserID == currentUserID)
.Where(comment => comment.CreatedAt > createdSince)
.OrderByDescending(comment => comment.CreatedAt)
.Select(comment => new {
Type = "comment",
CreatedAt = comment.CreatedAt
})
);
根据需要添加更多Concat语句,只要它们投影到相同的结构(anon或实际类),就可以将它们合并到一个列表中
如果您不喜欢有一个庞大的语句,并且有一个类来存储项(例如,Feed
),然后选择第一个类并执行.ToList()
,那么您将有一个列表
,可以为每个要包含的额外项集调用.AddRange(LinqQueryAtreturnsFeedItems)
只需对每个列表进行排序并提供额外的过滤器。一旦将它们合并为一个列表,您就可以对合并列表进行排序。好的,我最后做的是以下几点:
public class UserFeed
{
public string Type { get; set; }
public int Reference_Id { get; set; }
public int Comic_Id { get; set; }
public int Chapter_Id { get; set; }
public int Page_Id { get; set; }
public int User_Id { get; set; }
public string Title { get; set; }
public string Text { get; set; }
public decimal Rating { get; set; }
public string Image { get; set; }
public DateTime Date { get; set; }
}
List<UserFeed> userFeed = new List<UserFeed>();
userFeed.AddRange(user.SelectMany(i => i.UserFavorites).Select(i => new UserFeed { Type = "UserFavorite", Reference_Id = i.UserFavorite_Id, Comic_Id = i.Comic_Id, Title = i.Comic.Title, Image = i.Comic.ComicImage, Date = i.DateFavorited }).OrderByDescending(i => i.Date).Take(6));
userFeed.AddRange(Comics.SelectMany(i => i.ComicReviews).Select(i => new UserFeed { Type = "ComicReview", Reference_Id = i.ComicReview_Id, Comic_Id = i.Comic_Id, Title = i.Comic.Title, Text = i.Text, Rating = i.ComicRating.Rating, Image = i.Comic.ComicImage, Date = i.DatePublished }).OrderByDescending(i => i.Date).Take(6));
userFeed.AddRange(Comics.SelectMany(i => i.Chapters).Select(i => new UserFeed { Type = "Chapter", Reference_Id = i.Chapter_Id, Comic_Id = i.Comic_Id, Title = i.Title, Image = i.Comic.ComicImage, Date = i.DatePublished }).OrderByDescending(i => i.Date).Take(6));
userFeed.AddRange(Comics.SelectMany(i => i.Chapters.SelectMany(j => j.Pages)).Select(i => new UserFeed { Type = "Page", Reference_Id = i.Page_Id, Chapter_Id = i.Chapter_Id, Title = i.Title, Image = i.PageImage, Date = i.DatePublished }).OrderByDescending(i => i.Date).Take(6));
公共类用户提要
{
公共字符串类型{get;set;}
公共int引用_Id{get;set;}
public int Comic_Id{get;set;}
public int Chapter_Id{get;set;}
公共整数页_Id{get;set;}
公共int用户_Id{get;set;}
公共字符串标题{get;set;}
公共字符串文本{get;set;}
公共十进制评级{get;set;}
公共字符串图像{get;set;}
公共日期时间日期{get;set;}
}
List userFeed=new List();
userFeed.AddRange(user.SelectMany(i=>i.UserFavorites).Select(i=>newuserfeed{Type=“UserFavorite”,Reference_Id=i.UserFavorite_Id,Comic_Id=i.Comic_Id,Title=i.Comic.Title,Image=i.Comic.ComicImage,Date=i.DateFavorited}).OrderByDescending(i=>i.Date).Take(6));
userFeed.AddRange(Comics.SelectMany(i=>i.ComicReviews)。选择(i=>new userFeed{Type=“ComicReview”,Reference_Id=i.ComicReview_Id,Comic_Id=i.Comic_Id,Title=i.Comic.Title,Text=i.Text,Rating=i.Comiccrating.Rating,Date=i.DatePublished})。OrderByDescending(i=>i.Date)。取(6));
userFeed.AddRange(漫画.SelectMany(i=>i.Chapters).选择(i=>newuserfeed{Type=“Chapter”,Reference_Id=i.Chapter_Id,漫画Id=i.Comic_Id,Title=i.Title,Image=i.ComicImage,Date=i.DatePublished}).OrderByDescending(i=>i.Date).Take(6));
userFeed.AddRange(Comics.SelectMany(i=>i.Chapters.SelectMany(j=>j.Pages)).Select(i=>newuserfeed{Type=“Page”,Reference\u Id=i.Page\u Id,Chapter\u Id=i.Chapter\u Id,Title=i.Title,Image=i.PageImage,Date=i.DatePublished}.OrderByDescending(i=>i.Date)。取(6));
我尝试了以下方法:但我得到了一个无法从'System.Linq.IQueryable'转换为'System.Linq.ParallelQuery
我非常确定数据匹配。最简单的解决方案是:创建一个类,并在select中而不是在一个非类中新建它,例如select(comment=>newfeed){Title=comment.Title,CreatedAt=comment.DatePublished})
那么你就可以毫无问题地进行concat了。别忘了在末尾添加一个userFeed=userFeed.OrderByDescending(feed=>feed.Date)
来对整个列表进行排序,除非你想要一块收藏夹,然后是一块评论,等等。