2008-08-27 6 views
21

क्या लिंक का उपयोग गतिशील रूप से फ़िल्टर बनाने के लिए एक पैटर्न है?क्या लिंक को डायनामिक रूप से फ़िल्टर बनाने के लिए एक पैटर्न है?

मुझे सूची में कस्टम फ़िल्टरिंग बनाने की आवश्यकता है, अतीत में मैं बस गतिशील रूप से एसक्यूएल बनाउंगा ... ऐसा लगता है कि यह लिंक के साथ संभव नहीं है।

उत्तर

19

बाहर चेक Dynamic Linq Library ScottGu के ब्लॉग से:

उदाहरण के लिए, नीचे एसक्यूएल वीबी क्वेरी के लिए एक मानक टाइप- सुरक्षित LINQ कि एक नॉर्थविंड डेटाबेस से डेटा प्राप्त करता है और एक ASP.NET GridView नियंत्रण में यह प्रदर्शित करता है:

Dim Northwind As New NorthwindDataContext 
Dim query = From q In Northwind.Products Where p.CategoryID = 2 And p.UnitPrice > 3 Order By p.SupplierID Select p 

Gridview1.DataSource = query 
GridView1.DataBind() 

मैं बजाय की तरह तो

Dim Northwind As New NorthwindDataContext 
Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId") 
Gridview1.DataSource = query 
GridView1.DataBind() 

सूचना ऊपर क्वेरी अभिव्यक्ति फिर से लिख सकता है LINQ DynamicQuery पुस्तकालय का उपयोग कैसे सशर्त-जहां खंड और सॉर्ट-ऑर्डरबी क्लॉज अब कोड अभिव्यक्तियों के बजाय स्ट्रिंग एक्सप्रेशन लेते हैं। क्योंकि वे देर से तार वाले तार हैं, मैं गतिशील रूप से उन्हें बना सकता हूं। उदाहरण के लिए: मैं अपने एप्लिकेशन का उपयोग करके एक अंतिम उपयोगकर्ता व्यापार विश्लेषक को यूआई प्रदान कर सकता हूं जो उन्हें अपने आप में प्रश्न बनाने के लिए सक्षम बनाता है (मनमाने ढंग से सशर्त खंड सहित)।

+0

क्या यह काम करता है? मुझे यह मिलता है: त्रुटि ओवरलोड रिज़ॉल्यूशन विफल रहा क्योंकि इन तर्कों के साथ कोई ऑर्डर 'ऑर्डरबी' नहीं कहा जा सकता है: प्रकार पैरामीटर के डेटा प्रकार (ओं) को इन तर्कों से अनुमानित नहीं किया जा सकता है। डेटा प्रकार निर्दिष्ट करना स्पष्ट रूप से इस त्रुटि को सही कर सकता है। मैं ओडरबी क्लॉज में पैरामीटर विकल्प के रूप में 'स्ट्रिंग' नहीं देख सकता। – JohnnyBizzle

+0

@ जॉनी बिज़ल - यह काम करता है। मैं इसे कई परियोजनाओं में उपयोग करता हूं। दो बार जांचें कि गतिशील.cs आपकी प्रोजेक्ट में है और आपने इसे अपने उपयोग घोषणाओं में ठीक से संदर्भित किया है। – Geoff

+0

यह बहुत अच्छा है। मुझे कभी नहीं पता था कि आप ऐसा कर सकते हैं। यह उन्नत खोज क्वेरी बिल्डिंग के साथ मेरी समस्या का समाधान करेगा। अच्छा एक +1 – ppumkin

2

ऐसा कुछ?

var myList = new List<string> { "a","b","c" }; 
var items = from item in db.Items 
      where myList.Contains(item.Name) 
      select item; 

ऐसा

SELECT * FROM Items [t0] where Name IN ('a','b','c') 
+1

दिलचस्प अवधारणा लेकिन थोड़ा उलझन में – ppumkin

9

गतिशील Linq एक एसक्यूएल बयान बनाना होगा एक रास्ता तय करना है।

यह आपके परिदृश्य के लिए अधिक हो सकता है। विचार करें:

IQueryable<Customer> query = db.Customers; 

if (searchingByName) 
{ 
    query = query.Where(c => c.Name.StartsWith(someletters)); 
} 
if (searchingById) 
{ 
    query = query.Where(c => c.Id == Id); 
} 
if (searchingByDonuts) 
{ 
    query = query.Where(c => c.Donuts.Any(d => !d.IsEaten)); 
} 
query = query.OrderBy(c => c.Name); 
List<Customer> = query.Take(10).ToList(); 
संबंधित मुद्दे