我有一个名为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,我应该如何使用它?
答案 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())