2008-12-13 6 views
34

मैं पंक्ति संख्या क्वेरी सेट पर पंक्ति संख्या कैसे प्रोजेक्ट कर सकता हूं।लिंक क्वेरी परिणाम में एक लाइन नंबर कैसे प्रोजेक्ट करें

कहते हैं के बजाय

:

फ़ील्ड 1, field2, फ़ील्ड 3

फ़ील्ड 1, field2, फ़ील्ड 3

मैं चाहूँगा:

1, फ़ील्ड 1, field2, फ़ील्ड 3

2 , फ़ील्ड 1, फ़ील्ड 2, फ़ील्ड 3

मेरा प्रयास यहां है इस पर:

public List<ScoreWithRank> GetHighScoresWithRank(string gameId, int count) 
{ 
    Guid guid = new Guid(gameId); 
    using (PPGEntities entities = new PPGEntities()) 
    { 
     int i = 1; 
     var query = from s in entities.Scores 
        where s.Game.Id == guid 
        orderby s.PlayerScore descending 
        select new ScoreWithRank() 
        { 
         Rank=i++, 
         PlayerName = s.PlayerName, 
         PlayerScore = s.PlayerScore 
        }; 
     return query.ToList<ScoreWithRank>(); 
    } 
} 
दुर्भाग्य

, "रैंक = i ++" लाइन निम्नलिखित संकलन समय अपवाद फेंकता है:

+0

संभावित डुप्लिकेट (http://stackoverflow.com/questions/269058/how-do-you-add-an-index-field- टू-लिनक-परिणाम) –

उत्तर

55

खैर, सबसे आसान "एक अभिव्यक्ति पेड़ एक असाइनमेंट ऑपरेटर शामिल नहीं हो सकता"

public List<ScoreWithRank> GetHighScoresWithRank(string gameId, int count) 
{ 
    Guid guid = new Guid(gameId); 
    using (PPGEntities entities = new PPGEntities()) 
    { 
     var query = from s in entities.Scores 
        where s.Game.Id == guid 
        orderby s.PlayerScore descending 
        select new 
        { 
         PlayerName = s.PlayerName, 
         PlayerScore = s.PlayerScore 
        }; 

     return query.AsEnumerable() // Client-side from here on 
        .Select((player, index) => new ScoreWithRank() 
          { 
           PlayerName = player.PlayerName, 
           PlayerScore = player.PlayerScore, 
           Rank = index + 1; 
          }) 
        .ToList(); 

    } 
} 
+3

डेटाबेस से सबकुछ प्राप्त करना यह वास्तव में 'समाधान' नहीं है – Adaptabi

+1

@DotNetWise: यह डेटाबेस से * सब कुछ * नहीं मिल रहा है - केवल क्वेरी से मेल खाता है। यह केवल मूल प्रयास के रूप में डेटाबेस से डेटा की एक ही राशि प्राप्त कर रहा है - बस कुछ पोस्ट-प्रोसेसिंग कर रहा है। –

+0

कैसा है? query.AsNumerable() दिए गए गेम आईडी के लिए सभी मिलान किए गए रिकॉर्ड खिलाएगा। 20 वीं के बाद रैंकिंग केवल पदों को लेने का प्रयास करें। रैंक रखने के लिए आपको डीबी से सब कुछ मिल जाएगा और फिर आपको जो चाहिए उसे काट लें। वास्तव में वांछित समाधान नहीं! इसके अलावा - गणना पैरामीटर कहां उपयोग किया जाता है? – Adaptabi

1

ठीक है, कि चाल किया: जिस तरह से डेटाबेस पक्ष क्लाइंट पक्ष के बजाय पर यह करते हैं, और चयन के अधिभार जो एक सूचकांक के रूप में अच्छी तरह से प्रदान करता है का उपयोग करने के लिए होगा। धन्यवाद।

यहाँ मेरा अंतिम कोड है ...

सर्वर:

public List<Score> GetHighScores(string gameId, int count) 
{ 
    Guid guid = new Guid(gameId); 
    using (PPGEntities entities = new PPGEntities()) 
    { 
     var query = from s in entities.Scores 
        where s.Game.Id == guid 
        orderby s.PlayerScore descending 
        select s; 
     return query.ToList<Score>(); 
    }                  
} 

ग्राहक:

void hsc_LoadHighScoreCompleted(object sender, GetHighScoreCompletedEventArgs e) 
{ 
    ObservableCollection<Score> list = e.Result; 

    _listBox.ItemsSource = list.Select((player, index) => new ScoreWithRank() 
          { 
           PlayerName = player.PlayerName, 
           PlayerScore = player.PlayerScore, 
           Rank = index+=1 
          }).ToList(); 
} 
+0

क्या आपको वास्तव में IHumerable की बजाय एक सूची सूची वापस करने के लिए GetHighScores() की आवश्यकता है? यदि आप इसे एक सूची में परिवर्तित करने जा रहे हैं, तो आप इसे एक बार भी कर सकते हैं। –

+0

@ जोन: वह इसके बजाय AsEnumerable को कॉल कर सकता है लेकिन ... ASENumerable विधि का संकलन-समय प्रकार के स्रोत को बदलने के अलावा कोई प्रभाव नहीं पड़ता है। http://msdn.microsoft.com/en-us/library/bb335435.aspx - दूसरे शब्दों में, यह वस्तुओं को स्मृति में नहीं लाएगा। अगर वह उस पर नियंत्रण चाहता है, तो Tolist अच्छा है –

+0

हां, लेकिन केवल * अगर * उसे उस बिंदु पर करने की ज़रूरत है। अगर उसे दो बार डेटा को कॉपी करने में कोई बात नहीं है। इसलिए मेरे संवेदना की प्रश्न प्रकृति :) असल में असीमित भी जरूरी नहीं है - अगर GetHighScores विधि को Inumerable वापस करने के लिए घोषित किया गया है जो ऐसा करेगा। –

0

आप भी अपने मूल कोड को सिर्फ एक मामूली समायोजन कर सकता है यह काम कर रहा करने के लिए । सावधानी का शब्द, यदि आप फिर से ऑब्जेक्ट को डेटाबेस या एक्सेस करते हैं, तो रैंक हर बार बढ़ेगा। उन मामलों में शीर्ष जवाब बेहतर है।

let Rank = i++ 

और

Rank.ToString() 

पूर्ण कोड:

public List<ScoreWithRank> GetHighScoresWithRank(string gameId, int count) 
{ 
Guid guid = new Guid(gameId); 
using (PPGEntities entities = new PPGEntities()) 
{ 
    int i = 1; 
    var query = from s in entities.Scores 
       let Rank = i++ 
       where s.Game.Id == guid 
       orderby s.PlayerScore descending 
       select new ScoreWithRank() 
       { 
        Rank.ToString(), 
        PlayerName = s.PlayerName, 
        PlayerScore = s.PlayerScore 
       }; 
    return query.ToList<ScoreWithRank>(); 
} 

}

+3

यह कोड भी संकलित नहीं करेगा। यह त्रुटि CS0832 उत्पन्न करता है: एक अभिव्यक्ति वृक्ष में असाइनमेंट ऑपरेटर –

0

यह समाधान मेरे लिए काम किया। http://www.dotnetfunda.com/articles/article1995-rownumber-simulation-in-linq.aspx

.Select((x, index) => new 
{ 
    SequentialNumber = index + 1 
    ,FieldFoo = x.FieldFoo       
}).ToList(); 
की [तुम कैसे Linq परिणाम के लिए एक सूचकांक क्षेत्र में शामिल कर सकता]
+0

हो सकता है जो ओवरलोड जो Int32 पैरामीटर लेता है वह इकाई ढांचे द्वारा समर्थित नहीं है। ध्यान दें कि dotNetFunda पर आलेख linq के साथ वस्तुओं के साथ काम करता है। –

संबंधित मुद्दे