2012-02-27 1 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 개의 동영상 수를 계산하기 때문에 채널 수는 5입니다. 원하는 채널 수는 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에서

반환 (()) 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 테이블에 질의와 일치하는 레코드를 찾아 반환하는 작업을 Azure 테이블에 맡기는 것입니다. 즉, 결과를 반환하기 전에 다른 부분을 원합니다. –

0

나는 잘못된 방향으로보고 있다고 생각합니다. 내가 올바르게 이해하면 "Kind"속성에 필터링을 적용하는 조항이 있습니다. 즉, 동영상이 다시 나타나지 않아야합니다 (채널 만). 그것은 작동하지 않는 것 같아요, 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 나에게. –

관련 문제