2012-02-27 48 views
0

我有一个Windows Azure表,叫做ChannelsVideos,它已被非规范化以同时保存通道和视频。该partitionKey由类别和频道的标题像这样的:Windows Azure Table CompareTo不能正常工作

业务,有些频道标题 宗教其他渠道标题

我使用了“ - ”字符分隔。

我有一个Kind属性,它是Channel或Video来指示“行”是频道还是视频条目。

我遇到的问题是试图计算特定用户的频道数量。我有一个像这样的陈述:

return (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.Tables.ChannelsVideos.ToString()) 
         where g.PartitionKey.CompareTo(categoryAndUser.CategoryID + "-") >= 0 
          && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
          && g.UserID.Equals(categoryAndUser.Key) 
         select g).AsTableServiceQuery().Execute().Count(); 

实际发生的事情是,频道的视频也被计算在内。这是为什么?因此,例如,如果我创建一个频道并向其中添加4个视频,则从上述语句返回的频道数为5个。因为它会计算频道,然后统计与该频道关联的4个视频。我只想要的是应该是1的通道数。

我在做什么或不做什么都看不到?我是否正确使用compareTo,应该如何使用它?

回答

0

我做了一些人工测试,并与该测试通过一系列通过所有类别手动去想出了:

int c1 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("ART AND HISTORY-") >= 0 && g.PartitionKey.CompareTo("BUSINESS-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c2 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("BUSINESS-") >= 0 && g.PartitionKey.CompareTo("ENTERTAINMENT-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c3 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("ENTERTAINMENT-") >= 0 && g.PartitionKey.CompareTo("ENVIRONMENT-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c4 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("ENVIRONMENT-") >= 0 && g.PartitionKey.CompareTo("HEALTH AND LIVING-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c5 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("HEALTH AND LIVING-") >= 0 && g.PartitionKey.CompareTo("LEARNING AND EDUCATION-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c6 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("LEARNING AND EDUCATION-") >= 0 && g.PartitionKey.CompareTo("NON HUMANS-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c7 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("NON HUMANS-") >= 0 && g.PartitionKey.CompareTo("PEOPLE AND PLACES AND EVENTS-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c8 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("PEOPLE AND PLACES AND EVENTS-") >= 0 && g.PartitionKey.CompareTo("POLITICS AND SCIENCE-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c9 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("POLITICS AND SCIENCE-") >= 0 && g.PartitionKey.CompareTo("RELIGION-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c10 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where (g.PartitionKey.CompareTo("RELIGION-") >= 0 && g.PartitionKey.CompareTo("SPORTS AND RECREATION-") < 0) 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

int c11 = (from g in tableServiceContext.CreateQuery<ChannelVideoEntity>(Enums.PazoozaTables.ChannelsVideos.ToString()) 
     where g.PartitionKey.CompareTo("SPORTS AND RECREATION-") >= 0 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
     && g.UserID.Equals(FacebookUserID) 
     select g).AsTableServiceQuery().Execute().Count(); 

它现在的工作!

怀疑它是我如何使用CompareTo方法,看起来好像它的工作原理与运算符之间的传统SQL一样,如果你没有指定结尾分隔符,它将继续抓取东西!

感谢您的输入!

0

我没有测试过,但我会建议使用SELECT DISTINCT:在tableServiceContext.CreateQuery(Enums.Tables.ChannelsVideos.ToString

回报(从克()) 其中g.PartitionKey.CompareTo(categoryAndUser .CategoryID + “ - ”)> = 0 & & g.Kind.Equals(Enums.TableKinds.Channel.ToString()) & & g.UserID.Equals(categoryAndUser.Key) 选择克).AsTableServiceQuery() 。执行()。 Distinct().Count();

我想如果你真的看看结果,你会看到5条通道。

+0

嗨汤姆感谢您的意见。不幸的是,你提出的方法是事后。我想要做的就是让Azure表执行所有查找与查询相匹配的记录并返回它们的工作。换句话说,我希望在返回结果之前发生不同的部分。 – 2012-02-27 21:46:57

0

我认为你看错了方向。如果我理解正确,则对“Kind”属性有一个子句过滤,这意味着视频不应该回来(仅限频道)。这听起来像不起作用,独立于CompareTo子句。

如果我是对的,你应该调查为什么在返回的实体上没有正确设置“Kind”属性。

道歉,如果我误解了。

0

这可能是它包含的类别不只是您认为的类别。如果CategoryID是一个数字,那么您当前的查询将返回来自所有后续类别的项目。您可能需要使您的分类过滤器看起来有点像:

where g.PartitionKey.CompareTo(categoryAndUser.CategoryID + "-") >= 0 
    g.PartitionKey.CompareTo(((categoryAndUser.CategoryID) + 1) + "-") >= 0 
     && g.Kind.Equals(Enums.TableKinds.Channel.ToString()) 
+0

你的权利是这个问题。最后,我不得不指定我从这个博客上读到的范围: http://computrengineer.blogspot.co.nz/2011/06/azure-table-storage-selecting-partial.html 说明了这一点对我来说。 – 2012-02-28 01:49:25