使用2个分页列表确保数据按日期顺序排列

时间:2010-09-30 10:15:45

标签: c# .net linq twitter

我有两个数据流,这两个数据都包含日期信息。

我从第一个获得10个项目,这是一个SQL数据库,10个项目来自第二个项目,这是一个Twitter提要。

当请求进入以获取更多数据时,它会从每个源检索下10个项目。

我发现的问题是来自数据库源的第二组10项可能比Twitter中的前10项更新,所以你有这样的数据

DB - Today
DB- Today             \\1st result set
Twitter - Yesterday
Twiter - Yesterday
\\\\\\\\\\\\\\\\\\\\\\\\\\\
DB - Today
DB - Today            \\2nd result set
Twitter - 3 days ago 
Twitter - 4 days ago

当用户看到日期结束时,这显然没有多大意义。

我唯一能想到的是从twitter中检索所有数据,而不是一次检索10条记录,然后使用LINQ进行数据库数据和推特数据的连接,然后按日期排序。

有人能想到更好的方法吗?

3 个答案:

答案 0 :(得分:0)

拥有一个包含所有邮件的数据结构,不管它们的来源如何都不容易吗?

例如,您可以拥有一个“消息”列表,该列表将由数据库或Twitter订阅源填充。然后,您可以按日期排序此列表并显示它。

我认为这会缓解这个过程。

答案 1 :(得分:0)

如果要将两个源混合到单个分页结果中,则必须获取额外数据。请考虑使用pagesize = 10

的这些示例

第1页:

  • 从DB
  • 请求10条记录
  • 从twitter
  • 索取10条记录

由于所有10条记录可能来自一个来源,因此您必须准备好每条来源的10条记录。


对于第2页,不知道第1页上的内容:

  • 从DB
  • 请求20条记录
  • 从twitter请求20条记录。

第2页可能包含来自第1页未显示的来源的前10条记录,或第1页上显示的来自源的第10条记录...因此您必须请求40条记录才能涵盖所有内容可能会出现在第2页。


对于知道第1页上的内容的第2页,请使用未使用的page1记录并请求足够的记录,使您从每个来源获得10个。

  • 如果第1页看起来像(10个来自DB,0来自推特),那么你只需要从DB请求接下来的10个记录。
  • 如果第1页看起来像(5个来自DB,5个来自推特),那么你只需要从每个来源请求接下来的5个记录。

从每个来源获得10条新记录后,就像第1页一样解决问题。


第3页及以后,

  • 请求来自每个来源的pagenumber * pagesize * 2条记录
  • 或者请求足够的记录,让您从每个来源获取10条新记录,以便考虑此页面。

答案 2 :(得分:0)

我从Twitter返回所有数据并将其合并到数据库中的数据中:

var dbAllData = Post.All();  //IQueryable

            UserTimelineOptions options = new UserTimelineOptions();
            options.ScreenName = "USERNAME";
            options.Count = 5000;
            options.IncludeRetweets = true;

            TwitterStatusCollection recentTweets = TwitterTimeline.UserTimeline(options);


            var dbAllMerged = dbAllData.AsEnumerable().Select((title) => new BlogData { Title = title.Title, Date = title.Date, RelativeDate = title.Date.ToRelativeDate(), Text = title.Text, DBRecord = true });

            dbAllMerged = dbAllMerged.Concat(recentTweets.Where(y => !y.Text.StartsWith("@")).Select((tweet) => new BlogData { Title = "", Date = tweet.CreatedDate, RelativeDate = tweet.CreatedDate.ToRelativeDate(), Text = tweet.Text, DBRecord = false })).OrderByDescending(x => x.Date);