2015-12-17 9 views
29

यह नतीजे के पुन: उपयोग के बारे में नहीं है बल्कि अधिक कथन है। न ही इसका उपयोग करते समय एक त्रुटि के बारे में है: LINQ to SQL: Reuse lambda expressionLINQ क्वेरी का पुन: उपयोग

बेहद जिज्ञासा से मैं सोच रहा था कि एक सिंगल LINQ कथन का पुन: उपयोग करना संभव है या नहीं।

चलें कहते हैं कि मैं निम्नलिखित LINQ बयान है:

.Where(x => x.Contains("")); 

यह बयान x => x.Contains("") अन्य वर्ग निकालने और बाद में उपयोग के लिए यह करने के लिए संदर्भ किसी तरह का उपयोग करने के लिए कहते हैं, की सुविधा देता है, संभव है?

तो मुझे यह पसंद है कॉल कर सकते हैं: .Where(previouslySavedStatement);

+5

इसे एक चर में डाल दिया। 'Func func = x => x.contains (" ");' –

+3

@wudzik यह डुप्लिकेट नहीं है। डुप्लिकेट संदर्भ का परिणाम दोबारा उपयोग करने का संदर्भ है, सवाल स्वयं क्वेरी का पुनः उपयोग करने के बारे में पूछता है। – Shlomo

+0

धन्यवाद श्लोमो :) बस खुद को संपादित करें – Blaatz0r

उत्तर

35

आप इसे एक चर में स्टोर कर सकते हैं। आप IQueryable के साथ काम कर रहे हैं तो का उपयोग करें:

System.Linq.Expressions.Expression<Func<Foo, bool>> selector = x => x.Contains(""); 

आप IEnumerable उपयोग कर रहे हैं तो का उपयोग करें:

Func<Foo, bool> selector = x => x.Contains(""); 

और अपने प्रश्न में इसका इस्तेमाल करते हैं:

query.Where(selector); 
+6

FYI से @ Blaatz0r यदि आप 'IQueryable ' के बजाय 'IENumerable ' के साथ काम कर रहे हैं, तो आप केवल 'Func selector = ...' का उपयोग करेंगे, लेकिन यदि आप 'IQueryable 'का उपयोग कर रहे हैं, तो आप सबसे अधिक अपमानजनक रूप से चाहते हैं 'अभिव्यक्ति >' संस्करण का उपयोग करें। –

+1

@ScottChamberlain मेरे अधिकांश विवरण हैं Inumerable इसलिए – Blaatz0r

+1

@ Blaatz0r के लिए धन्यवाद, यदि आपके पास अभिव्यक्ति संस्करण है तो आप इसे 'Func selector2 = selector.Compile();', 'द्वारा एक प्रतिनिधि में भी परिवर्तित कर सकते हैं। किसी प्रतिनिधि से दूसरी अभिव्यक्ति को अभिव्यक्ति में नहीं जा सकता है। –

5

यह निर्भर करता है। दो Where विधियां, Enumerable.Where और Queryable.Where हैं। यदि आप पहले 0 की तुलना में .Where को IEnumerable पर लागू कर रहे हैं, तो यदि आप इसे IQueryable पर लागू कर रहे हैं तो दूसरे को बुलाया जाता है।

चूंकि Enumerable.WhereFunc में आता है, यह पुन: प्रयोज्य नहीं है। चूंकि Queryable.Where एक अभिव्यक्ति में लेता है, यह पुन: प्रयोज्य है।

var x = new List<string>().AsQueryable(); 

var query = x.Where (n => n.Contains("some string")); 

//Extract the lambda clause 
var expr = query.Expression; 
var methodExpr = (MethodCallExpression)expr; 
var quoteExpr = (UnaryExpression)methodExpr.Arguments[1]; 
var funcExpr = (Expression<Func<string, bool>>)quoteExpr.Operand; 

फिर आप बाद में फिर से लागू कर सकते हैं जहां अभिव्यक्ति:: तुम कितने इस प्रकार कर सकते हैं

var query2 = x.Where(funcExpr); 
+1

क्या आपने स्वीकार्य उत्तर भी पढ़ा है? – CSharpie

+2

हां, मैंने स्वीकार्य उत्तर भी पढ़ा, और मैंने भी प्रश्न पढ़ा। मुझे यह भी विश्वास है कि मेरा जवाब प्रश्न का उत्तर देता है क्योंकि स्वीकार्य उत्तर से भी बेहतर पूछा जाता है। – Shlomo

8

हाँ, आप जो लेता है एक समारोह क्वेरी आप पुन: उपयोग करना चाहते हैं, लिख सकते हैं और कर सकते हैं एक IQueryable < टी रिटर्न >

public IQueryable<T> ContainsEmpty(IQueryable<T> query) 
    { 
     return query.Where(x => x.Contains("")); 
    } 

अब आप इसे पुन: उपयोग कर सकते हैं:

query1 = ContainsEmpty(query1); 
    query2 = ContainsEmpty(another); 
+0

+1 यह सीधे ओपी के प्रश्न का उत्तर नहीं देता है, लेकिन यह उसकी समस्या को हल करने का एक बेहतर तरीका है _ (हालांकि, आपने 'IQueryable ' 'IENumerable ' के बजाय क्यों चुना?) _ –

+1

डेटाटाइप निर्दिष्ट नहीं है सवाल, लेकिन यह "LINQ से SQL" का उल्लेख करता है और शीर्षक में "क्वेरी" है, इसलिए मैंने अनुमान लगाया IQueryable :-) – buffjape

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