2009-04-27 18 views
15

मेरे पास एक तरीका है कि 'SQL के लिए कोई अनुवाद नहीं है' जिसे मैं एक IQueryable पर निष्पादित करना चाहता हूं, क्या IQueryable को कुछ इंटरमीडिएट क्लास में स्टोर किए बिना निष्पादित करने के लिए मजबूर करने का कोई तरीका है?निष्पादित करने के लिए एक IQueryable बल?

+0

यह एक अंधा अनुमान है, लेकिन यदि स्ट्रिंग। IsNullOrEmpty अपराधी है तो इसके बजाय खंड 2 का उपयोग करें: जहां (o => o.Name! = Null)। जहां (o => o.Name.Length> 0) । – mayu

उत्तर

25

क्या समस्या है कि आप डेटाबेस में स्थानीय स्थान पर स्थानीय रूप से निष्पादित करना चाहते हैं? यदि ऐसा है, तो AsEnumerable आपका मित्र है। यह एक बहुत ही सरल तरीका है, कुछ की तरह:

public IEnumerable<T> AsEnumerable(IEnumerable<T> source) 
{ 
    return source; 
} 

महत्वपूर्ण बात यह है कि यह नहीं बल्कि IQueryable<T> से परिणाम IEnumerable<T> का संकलन समय प्रकार है, जो किसी भी LINQ क्वेरी ऑपरेटर आपको बाद कि LINQ हो जाएगा फोन का मतलब है बनाता है LINQ से SQL के बजाय ऑब्जेक्ट्स के लिए।

उदाहरण के लिए:

var query = context.Employees 
        // Filtering performed in SQL 
        .Where(emp => emp.IsFullTime) 
        .AsEnumerable() 
        // Projection performed locally; ComputeSalary has no 
        // SQL equivalent 
        .Select(emp => new { Employee = emp, 
             Salary = ComputeSalary(emp) }); 

आप ToList कह सकते हैं के रूप में कहीं और सुझाव दिया, लेकिन अगर आप को छानने कर रहे हैं और वास्तव में नहीं है स्मृति में पूर्ण सूची की जरूरत है, AsEnumerable और छानने कि बुला परिणाम पहले सब कुछ लोड करने से अधिक कुशल होगा।

+1

क्या यह तकनीक लिंक से ईएफ के साथ भी है? ऐसा प्रतीत नहीं होता है। – neontapir

+0

मुझे समझ में नहीं आता कि 'डेटाबेस के बजाय स्थानीय रूप से निष्पादित' का अर्थ क्या है। मेरे जैसे लोगों के लिए: IQueryable = x में से एक का चयन करें; फिर ए। गणना(); a.Foreach (...) दो SQL क्वेरी निष्पादित करेगा। – mayu

+2

@Tymek: हाँ, जो दो SQL क्वेरी निष्पादित करता है। लेकिन "स्थानीय रूप से निष्पादित" से मेरा मतलब है "डेटाबेस से अब तक सभी परिणामों को क्वेरी में लाएं, लेकिन फिर शेष क्वेरी को स्मृति में करें" - ताकि आप फ़िल्टरिंग, अनुमान आदि कर सकें जो SQL में लागू नहीं हैं। –

6
List<Employees> myEmployees = myqueryable.ToList(); 

और फिर आपको लगता है कि सूची पर अपने LINQ सामान कर सकते हैं।

2

आपको यह संदेश मिलता है जब आपने एक प्रश्न लिखा है कि LinqToSql को SQL में अनुवाद करने का तरीका नहीं पता है (जो यह भी कहता है)।

मुझे यकीन है कि मैं तुम्हें वास्तव में क्या कह रहे हैं, लेकिन नहीं कर रहा हूँ के रूप में जहाँ तक मैं देख, आप निम्नलिखित विकल्प हैं:

  1. आपकी क्वेरी पुनः लिखें, ताकि LinqToSql कर सकते हैं का अनुवाद यह
  2. के रूप में कार्य करें क्वेरी के ज्यादा के रूप में आप SQL सर्वर पर है, तो स्मृति में आराम कर सकते हैं (वस्तुओं के लिए LINQ का उपयोग करके)
  3. सिट नीचे और रोना

मान लिया जाये कि हम # 3 से इनकार, दूसरे की 2 को देखो उदाहरण।

  1. इसे पुनर्लेखन - इसके साथ मदद करने के लिए, हमें आपकी linq क्वेरी की आवश्यकता है।

  2. यहां आप उस भाग को बाहर लेते हैं जिसका प्रारंभिक क्वेरी से अनुवाद नहीं किया जा सकता है, फिर अपने Iqueryable कॉल ToList पर, और उसके बाद उस सूची में शेष क्वेरी लागू करें।

और क्या आप इसे स्टोर किए बिना क्वेरी निष्पादित कर सकते हैं? खैर, वास्तव में, आप हमेशा परिणामों के माध्यम से लूप कर सकते हैं और इस तरह इसे एक चर में स्टोर नहीं करते हैं, लेकिन स्पष्ट रूप से क्वेरी के परिणामों को कहीं भी संग्रहीत करने की आवश्यकता है।

+1

किसी को रोने के लिए बैठने की आवश्यकता नहीं है। – mayu

+2

बहुत सच है - हालांकि मुझे लगता है कि खड़े होने पर कोई भी व्यक्ति रोना नहीं चाहिए। अगर आपको रोना है, तो आपको इसे ठीक से करने की ज़रूरत है। – kastermester

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