Windows Azure表比较不起作用

时间:2012-02-27 06:22:21

标签: azure azure-storage azure-table-storage

我有一个名为ChannelsVideo的Windows Azure表,它已被非规范化以将频道和视频同时保存在一起。 partitionKey由Channel的Category和Title组成,如下所示:

商业 - 一些频道标题 宗教 - 另一个频道标题

我使用“ - ”字符来分隔它们。

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

我遇到的问题是尝试计算特定用户的频道数。我的声明如下:

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,我应该如何使用它?

4 个答案:

答案 0 :(得分:0)

我没有测试过,但我建议使用select distinct:

return(来自tableServiceContext.CreateQuery中的g(Enums.Tables.ChannelsVideos.ToString())                         其中g.PartitionKey.CompareTo(categoryAndUser.CategoryID +“ - ”)&gt; = 0                             &安培;&安培; g.Kind.Equals(Enums.TableKinds.Channel.ToString())                             &安培;&安培; g.UserID.Equals(categoryAndUser.Key)                         选择g).AsTableServiceQuery()。执行()。区别()。Count();

我认为如果您实际查看结果,您将看到5个频道。

答案 1 :(得分:0)

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

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

如果我误解了道歉。

答案 2 :(得分: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之间的运算符一样,如果你没有指定结束分隔符,它只会继续抓取东西!

感谢您的投入!

答案 3 :(得分:0)

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

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