2012-06-07 14 views
15

मैं इस तरह के एक चर घोषित कैसे करूं?खाली क्विक करने योग्य घोषित करना?

  var rData = from nc in ctx.NEWSLETTER_CLIENTS 
         join ni in ctx.NEWSLETTER_INDICES on nc.INDEX_NUM 
                  equals ni.INDEX_NUM 
         select new 
         { 
          ClientID = nc.CLIENT_ID, 
          Email = nc.CLIENT_EMAIL_ADDRESS, 
          Index = nc.INDEX_NUM, 
          MainClass = ni.MAIN_CLASS, 
          SubClass = ni.SUB_CLASS, 
          App1 = ni.VALUE_1, 
          App2 = ni.VALUE_2, 
          App3 = ni.VALUE_3, 
          App4 = ni.VALUE_4 
         }; 

     // Now I need to declare on a variable named fData under the function scope, 
     // so I can later use it: 

     var fData = ...; //What do I declare here? 

     if(x) 
      fData = fData.Concat(rData.Where(u => ...)); 
     if(y) 
      fData = fData.Concat(rData.Where(u => ...)); 
     // etc 

उत्तर

33
IQueryable<type of p> fData = null; 

आप बाद में (अगर बाद iow) क्वेरी का उपयोग करना चाहते हैं:

var fData = Enumerable.Empty<type of p>().AsQueryable(); 

अद्यतन:

गुमनाम प्रकार के साथ प्रयोग करने के लिए अब

:

IQueryable<T> RestOfMethod<T>(IQueryable<T> rData) 
{ 
    var fData = Enumerable.Empty<T>().AsQueryable(); // or = rData; 

    if(x) 
    fData = fData.Concat(rData.Where(u => ...)); 
    if(y) 
    fData = fData.Concat(rData.Where(u => ...)); 

    return fData; 
} 

// original code location 
var rData = some query; 
var fData = RestOfMethod(rData); 

अद्यतन 2:

के रूप में बताया, ऊपर वास्तव में काम नहीं करता है, के रूप में Where की विधेय प्रकार नहीं जानता है। आप इसे कुछ और refactor सकता मानकों में विधेय शामिल करने के लिए, उदाहरण के लिए:

IQueryable<T> RestOfMethod<T>(IQueryable<T> rData, 
    Expression<Func<T,bool>> pred1, 
    Expression<Func<T,bool>> pred2) 
{ ... } 

अद्यतन 3: (शायद hacky)

var fData = rData.Take(0); // should be cheap. 
+0

कि के लिए धन्यवाद, यह मदद करता है एक स्पष्टीकरण – Shai

+0

के लिए मेरे संपादन देखना @ शाई: गुमनाम प्रकारों के लिए, आसानी से संभव नहीं है, लेकिन आंशिक रूप से शेष विधि के थोड़ा सा रिफैक्टरिंग करके किया जा सकता है। – leppie

+0

@Shai: मैंने अपनी पिछली टिप्पणी में जो मतलब था उसका एक उदाहरण जोड़ा है। – leppie

-1

आप के बजाय एक IQueryable के रूप में यह घोषणा कर सकते हैं एक var। कारण आप var के रूप में fData घोषित नहीं कर सकते हैं क्योंकि "var" को घोषणा के दौरान प्रकार का अनुमान लगाने की आवश्यकता है। यदि आप समय से पहले के प्रकार को जानते हैं, तो आप इसे ठीक से घोषित कर सकते हैं। कि इस प्रदान करती है अशक्त

IQueryable<type-of-p> fdata = null; 

नोट:

IQueryable fData = null; 

और भी बेहतर, यदि आप पी के प्रकार पता है, तुम यह दृढ़ता से IQueryable के सामान्य रूप से लिखा है, कर सकते हैं! यदि आप इसका उपयोग करने का प्रयास करते हैं, तो आपको एक शून्य संदर्भ अपवाद मिलेगा। यदि आप वास्तव में खाली क्वेरी करने योग्य ऑब्जेक्ट चाहते हैं, तो लेप्पी के सुझाव का उपयोग करें, और Enumerable.Empty() का उपयोग करके एक खाली संग्रह बनाएं। AsQueryable() विधि श्रृंखला।

+0

मुझे अत्यधिक काम पर संदेह है (या यहां तक ​​कि संकलित) जब तक कि आप ऑब्जेक्ट पर 'p' नहीं डालते। – leppie

+0

आपको वस्तु को पी डालने की आवश्यकता नहीं है; सब कुछ है .NET वस्तु के लिए पूरी तरह से परिवर्तनीय है। – BTownTKD

+0

यह कॉन्वर्सिस के कारण .NET 4 के तहत काम कर सकता है, लेकिन यह निश्चित रूप से .NET 3.5 पर असफल हो जाएगा। – leppie

2

ठीक है, निम्नलिखित समाधान बुरा हो सकता है (और यहां तक ​​कि कुछ अवांछित भूमि के ऊपर होते हैं), लेकिन, यह काम करता है:

var fData = from p in rData 
      where 0 == 1 
      select p; 

if(x) 
    fData = fData.Concat(rData.Where(u => ...)); 
if(y) 
    fData = fData.Concat(rData.Where(u => ...)); 
संबंधित मुद्दे