2013-06-03 33 views
1

如果您注释掉了SinceID或MaxID子句,则以下查询可以正常工作,但是当两者都包含时,会生成“错误url”异常。搜索失败,使用maxid(ulong.max)和sinceid设置,但单独运行

var maxId = ulong.MaxValue; 
var sinceId = (ulong)341350918903701507; 

var searchResult = 
(
    from search in ctx.Search 
     where search.Type == SearchType.Search && 
     search.ResultType == ResultType.Mixed && 
     search.Query == "red wedding" && 
     search.SinceID == sinceId && 
     search.MaxID == maxId && 
     search.IncludeEntities == false && 
     search.Count == 200 
    select search).SingleOrDefault(); 

回答

1

如果你看一下查询结果的提琴手,你会看到的响应是:

{"errors":[{"code":195,"message":"Missing or invalid url parameter"}]} 

我不能,为什么推特会不会接受这两个SinceID响应查询和MaxID。但是,查询形成正确,并且没有任何文档描述这两个参数之间的关系对于此特定场景的约束条件。 MaxID的用途是成为下一个查询返回的最高推文的ID。 MaxID和SinceID都旨在帮助您浏览数据。我写了一篇关于如何做到这一点博客文章:

Working with Timelines with LINQ to Twitter

1

我似乎有同样的问题,因为你,所以我唯一的解决办法是做手工,所以首先我检索到的第一列表中的sinceId值设置为我有这样的:

var searchResult = 
      (
       from search in TwitterCtx.Search 
       where search.Type == SearchType.Search && 
         search.Query == query && 
         search.Count == pageSize && 
         search.IncludeEntities == true && 
         search.ResultType == ResultType.Recent && 
         search.SinceID == sinceId 
       select search 
      ).SingleOrDefault<Search>(); 

resultList = searchResult.Statuses; 

然后,我必须寻找其他的tweets(该情况下,当新的鸣叫计数更多的是pageSize的),所以我有这样的一个while循环:

ulong minId = ulong.Parse(resultList.Last<Status>().StatusID) - 1; 
List<Status> newList = new List<Status>(); 

while (minId > sinceId) 
{ 
    resultList.AddRange(newList); 

    searchResult = 
     (
      from search in TwitterCtx.Search 
      where search.Type == SearchType.Search && 
       search.Query == query && 
       search.Count == pageSize && 
       search.IncludeEntities == true && 
       search.ResultType == ResultType.Recent && 
       search.MaxID == minId && 
       search.SinceID == sinceId 
      select search 
     ).SingleOrDefault<Search>(); 

    newList = searchResult.Statuses; 
    if (newList.Count == 0) 
     break; 

    minId = ulong.Parse(newList.Last<Status>().StatusID) - 1; 
} 

现在由于某种原因,您可以同时使用sinceId和maxId。

0

为了防止其他人遇到此问题,我在MaxId是无效的Tweet ID时遇到了此问题。

我开始使用零但ulong.MaxValue具有相同的问题。用一个有效的值切换出来,它工作正常。如果你还没有使用SinceId,它似乎工作正常。

0

我以前得到同样的错误“Missing or invalid url parameter”,但根据Joe Mayo's solution,如果(因为id < maxID)条件在循环之前做了额外的添加,因为每当maxID小于时查询就会抛出上述错误sinceID,我认为这是不正确的。

if (sinceID < maxID) 
{ 
    do 
    { 
     // now add sinceID and maxID 
     searchResponse = 
      await 
      (from search in twitterCtx.Search 
      where search.Type == SearchType.Search && 
        search.Query == "from:@" + twitterAccountToDisplay + " -retweets" && 
        search.Count == count && 
        search.SinceID == sinceID && 
        search.MaxID == maxID 
        select search) 
       .SingleOrDefaultAsync(); 

       if (searchResponse == null) 
       break; 

       if (searchResponse.Count > 0 && searchResponse.Statuses.Count > 0) 
       { 
       newStatuses = searchResponse.Statuses; 
       // first tweet processed on current query 
       maxID = newStatuses.Min(status => status.StatusID) - 1; 
       statusList.AddRange(newStatuses); 

       lastStatusCount = newStatuses.Count; 
       } 
       if (searchResponse.Count > 0 && searchResponse.Statuses.Count == 0) 
       { 
        lastStatusCount = 0; 
       } 
     } 
     while (lastStatusCount != 0 && statusList.Count < maxStatuses);  
     //(searchResponse.Count != 0 && statusList.Count < 30); 
}