2016-08-11 11 views
5

मेरे पास TeamName और CurrentStatus फ़ील्ड वाली एक तालिका है। मैं रिकॉर्ड की गिनती हर टीम के लिए और प्रत्येक की स्थिति के लिए पाने के लिए एक LINQ क्वेरी बनाने हूँ:linq परिणामों में count = 0 शामिल करें

var teamStatusCounts = models.GroupBy(x => new { x.CurrentStatus, x.TeamName }) 
          .Select(g => new { g.Key, Count = g.Count() }); 

इस क्वेरी के परिणामों जहां गिनती 0. मैं पंक्तियों प्राप्त करने की आवश्यकता है के अलावा सभी मायने रखता है देता है, जहां एक विशिष्ट टीम और एक विशिष्ट स्थिति के लिए कोई रिकॉर्ड नहीं है (जहां गिनती = 0)।

+6

ठीक है, आप हवा से बाहर पंक्तियों नहीं बना सकते। शायद आपके पास सूचीबद्ध सभी टीमों के साथ एक अलग टेबल है। यदि ऐसा है, तो आपको दोनों तालिकाओं के बीच बाएं जुड़ने की आवश्यकता होगी। संपादित करें: और आपकी आवश्यकता के आधार पर, यह भी हो सकता है कि आपको उस तालिका में शामिल होने की आवश्यकता हो जिसमें सभी संभावित स्थितियां हों। – sstan

+1

आपने शायद अपनी स्थिति तालिका और अपनी टीमों में शामिल होने के भीतर मॉडल बनाया है? तो आप परिणाम तालिका में सभी स्थिति डेटा खो देंगे। आप या तो इसे बाएं जुड़ने के लिए बदल सकते हैं, या अंत में –

+1

पर खाली पंक्तियां जोड़ सकते हैं, जैसे 'var teamStatusCounts = allPossibleStatusAndTeamCombinations.Select (x => new {key = x, count = models.Count (y => y.CurrentStatus == x.CurrentStatus && y.TeamName == x.TeamName),}); '। –

उत्तर

2

आप टीम नाम के लिए एक अलग संग्रह है और स्थितियों में जो आप उम्मीद कर रहे हैं और परिणाम को लापता लोगों को जोड़ने सकता

//assuming allTeamNamesAndStatuses is a cross joing of all 'CurrentStatus' and 'TeamNames' 
var teamStatusCounts = models.GroupBy(x => new { x.CurrentStatus, x.TeamName }) 
          .Select(g => new { g.Key, Count = g.Count() }) 
          .ToList(); 

var missingTeamsAndStatuses = allTeamNamesAndStatuses 
        .Where(a=> 
         !teamStatusCounts.Any(b=> 
          b.Key.CurrentStatus == a.CurrentStatus 
          && b.Key.TeamName == a.TeamName)) 
        .Select(a=>new { 
         Key = new { a.CurrentStatus, a.TeamName }, 
         Count = 0 
        }); 

teamStatusCounts.AddRange(emptyGroups); 

I've created a fiddle demonstrating the answer as well

+0

यह वही है जो मुझे चाहिए !! धन्यवाद – Hanady

0
सेट

मैं पहली बार टीम के नाम और स्थिति का चयन होगा:

var teams = models.Select(x => x.TeamName).Distinct().ToList(); 
var status = models.Select(x => x.CurrentStatus).Distinct().ToList(); 

यदि आप पहले से ही सूची प्रविष्टियों को जानते हैं तो आप इसे छोड़ सकते हैं।

तो फिर तुम हर टीम के लिए चयन कर सकते हैं और प्रत्येक राज्य मॉडलों की संख्या:

var teamStatusCounts = teams.SelectMany(team => states.Select(state => 
    new 
    { 
     TeamName = team, 
     CurrentStatus = state, 
     Count = models.Count(model => 
        model.TeamName == team && model.CurrentStatus == state) 
    })); 
+0

यह काम नहीं कर सकता है अगर 'मॉडल' में टीम के नाम और स्थिति शुरू हो रही हैं, जो ओपी की समस्या है। – sstan

+0

@sstan मुझे लगता है कि आप सही हैं। मैंने सवाल गलत समझा। मैंने सोचा कि हमेशा 'मॉडल' में कम से कम एक बार प्रत्येक टीम का नाम और हर राज्य होता है। – Koopakiller

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