2013-08-25 3 views
1

Я пытаюсь создать канал на странице «Пользователи», где он будет отображаться, если пользователь недавно что-то понравился, создал элемент, прокомментировал сообщение и т. Д. Как мне это сделать? ? Я думал о том, чтобы создать список объектов различной информации, которую я получаю из своей базы данных, а затем упорядочить по дате, но я не могу правильно получить код.Создание фида событий, упорядоченных по дате

ответ

1

Хорошо, что я в конечном итоге делает что-то вдоль этих линий:

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)); 
+1

Не забудьте добавить 'userFeed = userFeed.OrderByDescending (feed => feed.Date)' в конце, чтобы отсортировать весь список, если вы не хотите, чтобы блок «Избранное» сопровождался блоком «Обзоры» и т. Д. –

1

Как насчет:

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 по мере необходимости, до тех пор, как они проецируют на одной и той же структуры (либо Анон или фактический класс), вы можете объединить их в один список.

Если вам не нравится, имея одно огромное заявление, и есть класс для хранения предметов (например Feed), а затем выберите первый и сделать .ToList(), то вы будете иметь List<Feed>, что вы можете назвать .AddRange(linqQueryThatReturnsFeedItems) для каждого дополнительного набора предметов, которые вы хотите включить.

Просто отсортируйте по списку и предоставьте дополнительные фильтры. После того, как вы объедините их в один, вы можете отсортировать объединенный список.

+0

я пытался делать что-то вдоль линий: http://pastebin.com/4WRYXntJ но я получаю 'не может конвертировать из ' System.Linq.IQueryable 'to' System.Linq.ParallelQuery 'Я уверен, что данные совпадают. –

+1

Простое решение: создайте класс и внесите его в свой выбор вместо классов anon, например. 'Select (comment => new Feed {Title = comment.Title, CreatedAt = comment.DatePublished})', тогда вы сможете без проблем конкатрировать. –

Смежные вопросы