2010-01-29 14 views
5

उपयोग करने के लिए कैसे मैं एक वर्ग के रूप में निम्नानुसार है:मैं बस समझ में नहीं आता Linq

Class Scan 
    Delivered As Boolean 
    ScanDate As Date 
    State As String 
    Facility As String 
End Class 

मैं तो एक सूची बना सकते हैं और स्कैन जो कुछ युक्त से पॉप्युलेट।

Dim Scans As New List(Of Scan) 

मुझे जानकारी के विभिन्न टुकड़े प्राप्त करने के लिए सूची में मेरी आवश्यकता है। मैं इसे करने के लिए LINQ का उपयोग करना चाहता हूं। समस्या यह है कि मेरे जीवन के लिए, मुझे बस यह नहीं मिला। वाक्यविन्यास मुझे फेंक देता है, तथ्य यह है कि परिणाम दृढ़ता से टाइप नहीं किए जाते हैं, और वेब पर नमूना oversimplified, या overcomplicated हैं।

मैं कैसे

  1. स्कैन की गिनती, दिनांक के आधार पर वर्गीकृत जहां = सच वितरित जहां = सच
  2. स्कैन की एक संख्या प्राप्त करें वितरित, सुविधा के आधार पर वर्गीकृत मिल सकता है
  3. स्कैन की एक संख्या प्राप्त करें , राज्य द्वारा समूहित जहां डिलिवरेड = ट्रू

मैं इसे प्रत्येक लूप के लिए उपयोग करना चाहता हूं।

For Each result In GroupedResults 
    ‘My Code 

Next 

आदर्श रूप में, मैं परिणाम दृढ़ता से टाइप करना चाहता हूं। क्या यह संभव है?

क्या कोई इस से शुरू करने के लिए कुछ लिंक सुझा सकता है? मैं जिस वेबसाइट पर आती हूं वह सिर्फ मेरे सिर को तैरती है। मैं इसे बिल्कुल समझ नहीं रहा हूँ।

संपादित करें:

बहुत बहुत लोग धन्यवाद। मैं अभी भी इस सामान पर अपने सिर को खरोंच कर रहा हूं, लेकिन कम से कम यह एक असली दुनिया का उदाहरण है जिसका उपयोग मैं क्या कर रहा हूं इसका विचार पाने के लिए कर सकता हूं।

मैं उम्मीद कर रहा था कि यह सरल उदाहरण मुझे वसंत बोर्ड को अधिक जटिल उपयोग में मदद करेगा - अभी तक कोई भाग्य नहीं है। मुझे बल्ले से यह पूछना चाहिए था।

सभी उदाहरण एक कुंजी/मूल्य प्रतिक्रिया का उपयोग करने लगते हैं। अगर मेरे पास दो मूल्य हैं तो मुझे समूह की आवश्यकता है?

Class Scan 
     Delivered As Boolean 
     Scanned As Boolean 
     ScanDate As Date 
     State As String 
     Facility As String 
    End Class 


1. Get a count of Delivered = True, a count of Scanned=True, grouped by Date 
2. Get a count of Delivered = True, a count of Scanned=True, grouped by Facility 
3. Get a count of Delivered = True, a count of Scanned=True, grouped by State 

क्या यह एक परिणाम में प्राप्त करना संभव है? संपादित

संपादित करें:

अपने ही संपादित उत्तर दिया! ऐसा लगता है कि मेरे लिए काम कर रहा है:

Dim query = From r In scans _ 
      Group r By r.ScanDate Into g = Group _ 
      Select New With _ 
      {g, .DeliveredCount = g.Count(Function(s) s.Delivered), .ScannedCount = g.Count(Function(s) s.Scanned)} 

बहुत बहुत धन्यवाद। तुमने मुझे उस बिंदु पर पहुंचाया जहां मैं समाधान हल कर सकता था। मैं अभी भी "प्राप्त" नहीं कर रहा हूं जो मैं कर रहा हूं (फ़ंक्शन क्या है ?!), लेकिन मुझे कुछ शुरू करने के लिए मिला है। मैं अब सीखने में समय बिताना चाहता हूं। मुझे लगता है कि वास्तव में मुझे क्या फेंक दिया गया है कि नेट पर नमूने सी # हैं। Normaly मुझे वाक्यविन्यास को बदलने में कोई समस्या नहीं है, लेकिन LINQ के साथ यह इतना आसान नहीं है। मैंने सोचा कि मैं कुछ गलत कर रहा था, लेकिन यह सिर्फ इतना था कि वाक्यविन्यास बहुत अलग था।

+0

क्या आप प्रत्येक डिलीवरी तिथि के लिए अलग-अलग मायने रख रहे हैं? तो आपके परिणाम होंगे: 3 दिन एक्स पर वितरित किए गए थे, 6 दिन वाई पर वितरित किए गए थे ... आदि क्या यह आप खोज रहे हैं? –

+1

आपको क्या लगता है कि परिणाम दृढ़ता से टाइप नहीं किए गए हैं? –

+0

वे दृढ़ता से टाइप किए गए हैं। यदि आप केवल एक वेनिला क्वेरी चलाते हैं (एस स्कैन सिले के रूप में एस) इसे स्कैन के रूप में नहीं डाला जाएगा, लेकिन आप ऐसा करने के लिए तुरंत सीटी टाइप का उपयोग कर सकते हैं। –

उत्तर

4

आप LINQ के क्वेरी सिंटैक्स का उपयोग करने तक सीमित नहीं हैं। आप संग्रह पर LINQ एक्सटेंशन विधियों का भी उपयोग कर सकते हैं।

परिणाम जो आपको मिलेगा वह दृढ़ता से टाइप किया जाएगा। यद्यपि अज्ञात प्रकार का उपयोग तब किया जाएगा जब आप किसी मौजूदा प्रकार को वापस नहीं करते हैं।

नीचे कोड सी # है, लेकिन आप समझ जाएंगे कि:

static void Main(string[] args) 
{ 
    List<Scan> scans = new List<Scan>(); 

    scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility1")); 
    scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility2")); 
    scans.Add (new Scan (new DateTime (2010, 1, 1), false, "Facility3")); 
    scans.Add (new Scan (new DateTime (2010, 1, 26), true, "Facility1")); 

    var result1 = scans.Where (s => s.Delivered).GroupBy (s => s.ScanDate); 

    foreach(var r in result1) 
    { 
     Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count())); 
    } 

    var result2 = scans.Where (s => s.Delivered).GroupBy (s => s.Facility); 

    foreach(var r in result2) 
    { 
     Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count())); 
    } 

    Console.ReadLine(); 

} 

यहाँ परिणाम वास्तव में, टाइप नहीं है के बाद से एक GroupBy अभिव्यक्ति एक IGrouping प्रकार देता है। हालांकि, आप इस के आसपास हो सकता है, ऐसा करने से:

var result2 = scans.Where (s => s.Delivered) 
        .GroupBy (s => s.Facility) 
        .Select(s => new { Facility = s.Key, NumberOfItems = s.Count() }); 

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

सी # वाक्यविन्यास के लिए खेद है, लेकिन मैं वास्तव में वीबी.NET से परिचित नहीं हूं।

+0

आम तौर पर, क्वेरी सिंटैक्स पहले कम डरावना होता है, जो एसक्यूएल को जानते हैं और वास्तव में लैम्ब्डा सिंटैक्स नहीं जानते हैं, जो कि vb में बहुत भयानक है। –

+0

गंभीर। इसका अनुवाद: मंद परिणाम 2 = स्कैन। जहां (फ़ंक्शन (एस) वितरित)। _ ग्रुपबी (फंक्शन (एस) एस। फैसिलिटी)। _ चुनें (फ़ंक्शन (ओं) नया {.Facility = s.Key, .umberOfItems = s.Count()}) बदसूरत। – Brett

+0

हालांकि यह समाधान नहीं है, आखिर में यह है, यह वह जवाब है जिसने मुझे सही रास्ते पर पहुंचाया। धन्यवाद! – Brett

0

आप LINQ उपयोग करने के लिए मैं वस्तुओं (जैसे आपका ही वर्ग स्कैन के रूप में) के साथ LINQ का उपयोग करने पर यह पेज पढ़ने का सुझाव होगा करना चाहते हैं:

http://msdn.microsoft.com/en-us/library/bb397937.aspx

यह पर्याप्त सीधा पैदा करने के बिना समझने के लिए किया जाना चाहिए अपने स्पिन करने के लिए सिर। :)

अन्यथा, मैं सूची वर्ग का उपयोग करने का सुझाव दूंगा जिसमें कई सहायक कार्य हैं। यहाँ है कि के बारे में जानकारी के लिए देखें:

http://msdn.microsoft.com/en-us/library/d9hw1as6.aspx

2
Dim GroupedResults = from s in Scans _ 
        where Delivered _ 
        group s by ScanDate into g //edit here for the others _ 
        select new { Category = g.Key, ScanCount = g.Count() }; 

क्षमा याचना करता है, तो सी # vb रूपांतरण के लिए गलत है!

1

मैं एक ही भ्रम में आया था। मैं सहमत हूं कि दस्तावेज़ीकरण बहुत स्पष्ट नहीं है। अब मैं तीन परियोजनाओं में LINQ का उपयोग करता हूं, और मुझे यह पसंद है।

यदि आप LINQ से SQL का उपयोग कर रहे हैं, तो सर्वर दृश्य में अपने सर्वर से कनेक्शन बनाकर और अपनी तालिका को अपने डेटा संदर्भ में खींचकर अपनी LINQ कक्षा बनाएं। अन्यथा, बस अपनी स्कैन ऑब्जेक्ट्स के संग्रह के रूप में डीबी सेट करें।

1) जहां वितरित स्कैन की गिनती, दिनांक के आधार पर वर्गीकृत जाओ = सच

Dim db = new BrettsDataContext 
Dim Query = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By s.Date

2) जहां = सच वितरित स्कैन की गिनती, सुविधा के आधार पर वर्गीकृत जाओ

Dim db = new BrettsDataContext 
Dim Query2 = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By s.Date

3) राज्य द्वारा समूहीकृत स्कैन की गिनती प्राप्त करें, जहां वितरित = सही

Dim db = new BrettsDataContext 
Dim Query3 = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By s.State

वह अंतिम बार फिर से मिल जाएगा सुगंध पंक्तियां

Dim count = (From s as Scan in db _ 
Where s.Delivered = True).Count

आप सभी अलग प्रसव तिथियां चाहता था, तो आप निम्न क्वेरी कर सकता है:: तुम सिर्फ एक संख्या के रूप में गिनती चाहते हैं

Dim db = new BrettsDataContext 
Dim Query4 = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By DeliveryDate

किसी डेटा स्रोत के रूप में स्थापित करने के लिए, बस करो निम्नलिखित:

Dim db = new BrettsDataContext 
Dim Query = From s as Scan in db _ 
Where s.Delivered = True _ 
Order By s.Date 

gridview1.DataSource = Query

आशा है कि इससे मदद मिलती है!

+0

आप यहां गिनती कैसे प्राप्त करते हैं? और, LINQ अनिवार्य रूप से एक डीबी से संबंधित नहीं है। –

+0

यह LINQ से SQL है। यदि आप LINQ से ऑब्जेक्ट्स का उपयोग करना चाहते हैं, तो आप डेटाकॉन्टेक्स्ट का उपयोग नहीं करेंगे, लेकिन डेटाकॉन्टेक्स्ट के स्थान पर संग्रह का उपयोग करें। –

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