2012-11-19 29 views
5

मैं एक सरल tableQuery के साथ अपने Azure तालिका से शीर्ष n पंक्तियां लाने के लिए चाहता हूं। लेकिन नीचे दिए गए कोड के साथ, टेक के साथ मेरी सीमा के बावजूद सभी पंक्तियां प्राप्त की जाती हैं।टेबलक्वियर द्वारा मेरा टेकलिमिट सम्मानित क्यों नहीं किया गया है?

मैं क्या गलत कर रहा हूं?

int entryLimit = 5; 

var table = GetFromHelperFunc(); 

TableQuery<MyEntity> query = new TableQuery<MyEntity>() 
    .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "MyPK")) 
    .Take(entryLimit); 

List<FeedEntry> entryList = new List<FeedEntry>(); 
TableQuerySegment<FeedEntry> currentSegment = null; 

while (currentSegment == null || currentSegment.ContinuationToken != null) 
{ 
    currentSegment = table.ExecuteQuerySegmented(query, this.EntryResolver, currentSegment != null ? currentSegment.ContinuationToken : null); 
    entryList.AddRange(currentSegment.Results); 
} 


Trace.WriteLine(entryList.Count) // <-- Why does this exceed my limit? 
+1

स्वीकृत जवाब में पढ़ें पिछले टिप्पणी सही नहीं है - देखना @ Fabrzio का जवाब। – Ryan

उत्तर

12

भंडारण एसडीके पर टेक विधि LINQ में काम नहीं करेगा। कल्पना कीजिए कि आप कुछ इस तरह करते हैं:

TableQuery<TableEntity> query = new TableQuery<TableEntity>() 
       .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp")) 
       .Take(5); 
var result = table.ExecuteQuery(query); 

जब आप result से अधिक पुनरावृत्ति होने लगते हैं शुरू में केवल 5 आइटम मिल जाएगा। लेकिन नीचे, यदि आप result पर फिर से चलते रहते हैं, तो एसडीके तालिका से पूछताछ रखेगा (और 5 आइटमों के अगले 'पृष्ठ पर आगे बढ़ेगा)।

तो मैं अपनी तालिका में 5000 आइटम नहीं हैं, इस कोड को आउटपुट सभी 5000 आइटम (और नीचे एसडीके 1000 अनुरोध करते हैं और अनुरोध के अनुसार 5 आइटम लाएगा) होगा:

TableQuery<TableEntity> query = new TableQuery<TableEntity>() 
       .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp")) 
       .Take(5); 
var result = table.ExecuteQuery(query); 
foreach (var item in result) 
{ 
    Trace.WriteLine(item.RowKey); 
} 

निम्नलिखित कोड वास्तव में लायेगा 1 अनुरोध में और वहाँ रोक 5 आइटम:

TableQuery<TableEntity> query = new TableQuery<TableEntity>() 
       .Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "temp")) 
       .Take(5); 
var result = table.ExecuteQuery(query); 
int index = 0; 
foreach (var item in result) 
{ 
    Console.WriteLine(item.RowKey); 
    index++; 
    if (index == 5) 
     break; 
} 

वास्तव में, लें() विधि पृष्ठ आकार या "गिनती ले" (TakeCount TableQuery पर संपत्ति) तय करता है। लेकिन अगर आप केवल 5 रिकॉर्ड चाहते हैं तो समय पर फिर से चलना बंद करना आपके ऊपर है।

अपने उदाहरण में, आप TakeCount (जो आप ले फोन करके सेट) तक पहुंच गया जब रोकने के लिए है, जबकि पाश को संशोधित करना चाहिए:

while (entryList.Count < query.TakeCount && (currentSegment == null || currentSegment.ContinuationToken != null)) 
{ 
    currentSegment = table.ExecuteQuerySegmented(query, currentSegment != null ? currentSegment.ContinuationToken : null); 
    entryList.AddRange(currentSegment.Results); 
} 
+0

एक महान स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! –

+4

सैंड्रिनो, क्या आप उत्तर के बारे में निश्चित हैं? मेरे परीक्षण में सही ढंग से काम करता है। शायद आप स्टोरेज क्लाइंट के पुराने और बग किए गए संस्करण का संदर्भ दे रहे हैं https://github.com/WindowsAzure/azure-sdk-for-net/issues/144 –

+0

Nuget 9.1.0 अभी भी समस्या है और इसे यहां अनुशंसा का पालन करना पड़ा। –