2010-03-28 7 views
6

आवश्यकतानुसार "विशिष्ट प्रश्न" पर जाएं। कुछ पृष्ठभूमि:इस लिंक SQL को डायनामिक क्वेरी (स्ट्रिंग का उपयोग करके) के रूप में कैसे लिखें?

परिदृश्य: मेरे पास डीडीएल के साथ आबादी वाले "ड्रिल डाउन" फ़िल्टर (क्वेरी ऑब्जेक्ट) वाले उत्पादों का एक सेट है। प्रत्येक प्रगतिशील डीडीएल चयन से उत्पाद सूची को और साथ ही साथ डीडीएल के लिए कौन से विकल्प छोड़े जाएंगे। उदाहरण के लिए, उपकरण से हथौड़ा चुनने से उत्पाद आकार केवल हथौड़ा आकार दिखाने के लिए सीमित होता है।

वर्तमान सेटअप: मैंने एक क्वेरी ऑब्जेक्ट बनाया है, इसे एक भंडार में भेजा है, और प्रत्येक विकल्प को एक SQL "टेबल मूल्यवान फ़ंक्शन" में खिलाया है जहां शून्य मान "सभी उत्पाद प्राप्त करें" का प्रतिनिधित्व करते हैं।

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

विशिष्ट प्रश्न:

मैं एक Dynamic Query के रूप में इस क्वेरी कैसे पुनर्लेखन हैं? 101 Linq Examples जैसे कुछ के लिए एक लिंक शानदार होगा, लेकिन एक गतिशील क्वेरी स्कोप के साथ। मैं वास्तव में इस विधि को उद्धरण में फ़ील्ड पास करना चाहता हूं जिसके लिए मैं विकल्पों की एक सूची चाहता हूं और कितने उत्पादों में यह विकल्प है।

from p in db.Products 
group p by p.ProductSize into g 
select new Category { 
     PropertyType = g.Key, 
     Count = g.Count() } 

प्रत्येक DDL विकल्प होगा "चयन (21)" जहां (21) उत्पाद है कि उस विशेषता की मात्रा है। एक विकल्प चुनने पर, शेष सभी शेष डीडीएल शेष विकल्पों और गणनाओं के साथ अपडेट होंगे।

संपादित करें: अतिरिक्त नोट्स:

.OrderBy("it.City") // "it" refers to the entire record 
.GroupBy("City", "new(City)") // This produces a unique list of City 
.Select("it.Count()") //This gives a list of counts... getting closer 
.Select("key") // Selects a list of unique City 
.Select("new (key, count() as string)") // +1 to me LOL. key is a row of group 
.GroupBy("new (City, Manufacturer)", "City") // New = list of fields to group by 
.GroupBy("City", "new (Manufacturer, Size)") // Second parameter is a projection 

Product 
.Where("ProductType == @0", "Maps") 
.GroupBy("new(City)", "new (null as string)")// Projection not available later? 
.Select("new (key.City, it.count() as string)")// GroupBy new makes key an object 

Product 
.Where("ProductType == @0", "Maps") 
.GroupBy("new(City)", "new (null as string)")// Projection not available later? 
.Select("new (key.City, it as object)")// the it object is the result of GroupBy 

var a = Product 
     .Where("ProductType == @0", "Maps") 
     .GroupBy("@0", "it", "City") // This fails to group Product at all 
     .Select("new (Key, it as Product)"); // "it" is property cast though 

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

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

जॉन स्कीट एक शानदार विचार था: डाली कि मैं क्या IGrouping<string, Product> के रूप में की जरूरत है। जॉन स्कीट के लिए धन्यवाद! एक बार ऑब्जेक्ट डालने के बाद, आप सेट पर गणना कर सकते हैं और परिणामों को एक अलग सूची में फ़ीड कर सकते हैं।

+0

आप एक पूरे गतिशील क्वेरी की ज़रूरत है? क्या आपका फ़िल्टरिंग मानदंड नहीं है (जहां खंड) केवल गतिशील पहलू है? – Gabe

+0

मुझे विश्वास है कि मुझे एक पूर्ण डीक्यू चाहिए। प्रत्येक फ़ील्ड के लिए इस कोड को डुप्लिकेट किए बिना वे फ़िल्टर करना चाहते हैं, मुझे ग्रुपबी फ़ील्ड को एक स्ट्रिंग के रूप में निर्दिष्ट करने की आवश्यकता होगी। –

+0

IGrouping पर कास्ट करें <स्ट्रिंग, उत्पाद> केवल तभी संभव है जब आप 'इसे' वापस कर दें। जब आप उपयोग करते हैं। चयन करें ("नया (कुंजी, यह उत्पाद के रूप में, गिनती() गिनती के रूप में)") इसे कैसे डालना ???? –

उत्तर

4

मुझे यकीन नहीं है कि क्वेरी सिंटैक्स (उपरोक्त के रूप में) का उपयोग करके यह कैसे करें, लेकिन विधि सिंटैक्स का उपयोग करके, हम नीचे दिखाए गए एक अभिव्यक्ति < Func < का उपयोग कर सकते हैं।यह नमूना AdventureWorks SQL सर्वर डाटाबेस (उत्पाद तालिका) के खिलाफ काम करता है, और आप एक स्ट्रिंग का उपयोग करके जो समूह के लिए स्तंभ निर्दिष्ट कर सकते हैं (इस नमूने में मैं चुना है आकार)

using System; 
using System.Linq; 
using System.Linq.Expressions; 

namespace LinqResearch 
{ 
    public class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      string columnToGroupBy = "Size"; 

      // generate the dynamic Expression<Func<Product, string>> 
      ParameterExpression p = Expression.Parameter(typeof(Product), "p"); 

      var selector = Expression.Lambda<Func<Product, string>>(
       Expression.Property(p, columnToGroupBy), 
       p 
      ); 

      using (LinqDataContext dataContext = new LinqDataContext()) 
      { 
       /* using "selector" caluclated above which is automatically 
       compiled when the query runs */ 
       var results = dataContext 
        .Products 
        .GroupBy(selector) 
        .Select((group) => new { 
         Key = group.Key, 
         Count = group.Count() 
        }); 

       foreach(var result in results) 
        Console.WriteLine("{0}: {1}", result.Key, result.Count); 
      } 

      Console.ReadKey(); 
     } 
    } 
} 
1

यदि आप C# Bits पर एक नज़र डालें, तो लेखक चर्चा करता है कि गतिशील डेटा का उपयोग करके कैस्केडिंग फ़िल्टर कैसे बनाएं। ऐसा लगता है कि आप गतिशील डेटा का उपयोग नहीं कर रहे हैं, लेकिन उसके पास एक अच्छा अभिव्यक्ति निर्माता है जो आपके लिए उपयोगी हो सकता है। BuildQueryBody देखें, और उसके बाद Iqueryable पर एक्सटेंशन विधियों का निम्न खंड देखें।

चूंकि आप डायनामिक डेटा का उपयोग नहीं कर रहे हैं, इसलिए आपको "मेटावेरिनकेको कॉलम" ऑब्जेक्ट तक पहुंच न होने का सौदा करने की आवश्यकता होगी, लेकिन मुझे संदेह है कि उसका दृष्टिकोण आपके प्रश्न के साथ आपकी मदद कर सकता है।

मुझे उम्मीद है कि इससे मदद मिलती है।

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