2009-01-23 9 views
6

यदि मेरे पास शीर्षक कॉलम और 3 बिट कॉलम (एफ 1, एफ 2, एफ 3) वाली तालिका है जिसमें 1 या न्यूल है, तो मैं प्रत्येक की गिनती के साथ शीर्षक वापस करने के लिए LINQ कैसे लिखूंगा बिट कॉलम जिसमें 1 है? मैं इस SQL ​​क्वेरी के बराबर की तलाश में हूं:कई कॉलम पर LINQ COUNT

SELECT title, COUNT(f1), COUNT(f2), COUNT(f3) FROM myTable GROUP BY title 

मैं इसे करने का "सर्वश्रेष्ठ" तरीका ढूंढ रहा हूं। जब आप अंतर्निहित एसक्यूएल देखते हैं तो संस्करण 4 बार तालिका में डुबकी के साथ आया था, इसलिए यह बहुत धीमी है।

उत्तर

0

यहां समाधान है जिसके साथ मैं आया हूं। ध्यान दें कि यह समाधान @OdeToCode (लेकिन वीबी वाक्य रचना में) द्वारा प्रस्तावित करने के लिए करीब है, एक बड़ा अंतर के साथ:

Dim temp = _ 
    (From t In context.MyTable _ 
    Group t.f1, t.f2, t.f3 By t.title Into g = Group _ 
    Select title, g).ToList 

Dim results = _ 
    From t In temp _ 
    Select t.title, _ 
     f1_count = t.g.Count(Function(x) If(x.f1, False)), _ 
     f2_count = t.g.Count(Function(x) If(x.f2, False)), _ 
     f3_count = t.g.Count(Function(x) If(x.f3, False)) 

पहली क्वेरी समूह करता है, लेकिन सर्वर से के रूप में है ToList समूहीकृत आंकड़ों हो जाता है । गिनती को खत्म करने से परिणामी एसक्यूएल कथन प्रत्येक गिनती के लिए उप-चयन का उत्पादन करने से रोकता है। मैं स्थानीय रूप से दूसरी क्वेरी में गिनती करता हूं।

यह काम करता है क्योंकि मुझे पता है कि पहली क्वेरी पंक्तियों की एक प्रबंधनीय संख्या वापस कर देगी। अगर यह लाखों पंक्तियों को वापस कर रहा था, तो मुझे शायद दूसरी दिशा में जाना होगा।

+2

बड़े डेटा सेट के लिए इसका इस्तेमाल न करें! कृपया इसे अपने ऐप में कॉपी और पेस्ट न करें। इस जवाब पर एक बड़ी चेतावनी होनी चाहिए। –

2

मुझे लगता है कि यह वह जगह है जहां LINQ गिरता है। यदि आप एसक्यूएल का कुशल उपयोग करना चाहते हैं, तो यदि आप अच्छा कोड चाहते हैं, तो LINQ का उपयोग करें।

आप हमेशा क्वेरी को निष्पादित कर सकते हैं, क्योंकि आप पहले ही एसक्यूएल जानते हैं।

class TitleCount { 
    public string Title; 
    public int Count1; 
    public int Count2; 
    public int Count3; 
} 

DataContext dc = new DataContext("Connection string to db"); 

IEnumerable<TitleCount> query = dc.ExecuteQuery<TitleCount>(
    @"SELECT title, 
      COUNT(f1) as Count1, 
      COUNT(f2) as Count2, 
      COUNT(f3) as Count3 
     FROM myTable GROUP BY title"); 
4

आप एक LINQ क्वेरी के लिए छड़ी और एक गुमनाम प्रकार का उपयोग करना चाहते हैं, क्वेरी दिखाई देगा:

var query = 
     from r in ctx.myTable 
     group r by r.title into rgroup 
     select new 
     { 
      Title = rgroup.Key, 
      F1Count = rgroup.Count(rg => rg.f1 == true), 
      F2Count = rgroup.Count(rg => rg.f2 == true), 
      F3Count = rgroup.Count(rg => rg.f3 == true) 
     }; 

चाल पहचान करने के लिए है कि आप सही फ़ील्ड की संख्या की गणना करना चाहते है (यह एक नालीदार बूल के रूप में मैप किया जाता है), जो आप काउंटर ऑपरेटर और एक अनुमान के साथ कर सकते हैं। LINQ समूह ऑपरेटर पर अधिक जानकारी यहां: The Standard LINQ Operators

+3

यही वह समाधान है जो मैं मूल रूप से आया था, लेकिन परिणामी क्वेरी प्रत्येक व्यक्तिगत गणना के उत्पादन के लिए उप-चयन का उपयोग करती है। एक आधा मिलियन पंक्तियों (कोई अनुक्रमणिका नहीं) वाली तालिका पर, इस संस्करण में 7 सेकंड लगते हैं, जबकि 3 COUNT के साथ उचित SQL तत्काल है। – gfrizzle

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