2012-02-27 17 views
0

私はWindows Azure Table Called ChannelsVideosと呼ばれ、チャネルとビデオの両方を保持するために非正規化されています。 PartitionKeyはそのようなカテゴリーとチャンネルのタイトルで構成されていますWindows AzureテーブルCompareToが動作しない

ビジネス、いくつかのチャンネルタイトル 宗教、他のチャンネルタイトル

私が使用して - それらを区切るために、文字を「」。

「行」がチャンネルまたはビデオ項目であるかどうかを示す「チャンネル」または「ビデオ」の種類のプロパティがあります。

私が抱えている問題は、特定のユーザーのチャンネル数を数えようとしていることです。

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
私はそれをテストしていないが、私は選択の異なる使用を示唆している

:tableServiceContext.CreateQuery(Enums.Tables.ChannelsVideos.ToStringでグラムから

リターンを(()) g.PartitionKey.CompareTo(categoryAndUser .CategoryID + " - ")> = 0 & & g.Kind.Equals(Enums.TableKinds.Channel.ToString()) & & g.UserID.Equals(categoryAndUser.Key) 選択G).AsTableServiceQuery() .Execute()。 Distinct().Count();

実際に結果を見ると、チャンネルの5行が表示されます。

+0

残念ながら、あなたが提案するアプローチは事実の後にあります。私がしようとしているのは、Azureテーブルにクエリに一致するレコードを見つけて返す作業だけです。言い換えれば、結果を返す前に別個の部分が起こることを望みます。 –

0

あなたは間違った方向を見ていると思います。私が正しく理解していれば、ビデオは決して戻ってはならない(チャンネルのみ)ことを意味する「種類」のプロパティでフィルタリングする節があります。これは、CompareTo句とは独立して動作しないように思えます。

私が正しいとすれば、戻ってくるエンティティで「種類」プロパティが正しく設定されていない理由を調査する必要があります。

私が誤解した場合にはお詫び申し上げます。

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 私に。 –

関連する問題