2012-01-05 5 views
5

बाहर का उपयोग कर नीचे सरलीकृत कोड में,सशर्त दायरे के अंदर एक परोक्ष टाइप किया चर घोषणा और यह

if(city == "New York City") 
{ 
    var MyObject = from x in MyEFTable 
        where x.CostOfLiving == "VERY HIGH" 
        select x.*; 

} 
else 
{ 
    var MyObject = from x in MyEFTable 
        where x.CostOfLiving == "MODERATE" 
        select x.*; 

} 

    foreach (var item in MyObject) 
    { 
    Console.WriteLine("<item's details>"); 
    } 

चर MyObject सशर्त ब्लॉक के बाहर सुलभ नहीं है। अगर मैं बाहर से फिर से कैसे कर सकता हूं?

+0

मुझे लगता है आप ब्लॉक के बाहर चर घोषित कर सकता है। – ChaosPandion

+1

मुझे "लागू रूप से टाइप किए गए स्थानीय चर प्रारंभ किए जाने चाहिए" – FMFF

+1

'x। *' के साथ आपका मतलब अनाम प्रकार का निर्माण है, है ना? यदि नहीं, तो आप निहित टाइपिंग पर जोर क्यों दे रहे हैं? – CodesInChaos

उत्तर

24

चलिए आपके भ्रमित प्रश्न को स्पष्ट करते हैं। समस्या यह है कि आपके पास दो स्थानीय चर हैं, जिनमें से प्रत्येक का एक समान "अनपेक्षित" प्रकार है - अज्ञात प्रकार का अनुक्रम।

मैं इस तरह अपने विशिष्ट कोड बदल जाएगा:

string cost = city == "NYC" ? "HIGH" : "MODERATE"; 
var query = from row in table 
      where row.Cost == cost 
      select new { row.Population, row.Elevation }; 

हालांकि, अगर आप अभी भी कोड की संरचना को बनाए रखने के रूप में यह किसी कारण के लिए है की जरूरत है, तो आप इसे इस तरह से कर सकते हैं:

static IEnumerable<T> SequenceByExample<T>(T t){ return null; } 
... 
var query = SequenceByExample(new { Population = 0, Elevation = 0.0 }); 
if (whatever) 
    query = ... 
else 
    query = ... 

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

+3

यह बिना किसी संदेह के, मैंने देखा है कि सबसे स्मार्ट चाल है। – Polynomial

0

आप हालत पहले वर के रूप में MyObject को परिभाषित करना होगा:

var MyObject = from x in MyEFTable 
        where x.CostOfLiving == "SOMETHING THAT'LL RETURN NO ROWS" 
        select x.*; 

यह MyObject चर करने के लिए एक स्कीमा आवंटित करेगा।

अब आप अपने शर्त के साथ आगे बढ़ सकते हैं के रूप में:

if(city == "New York City") 
{ 
    MyObject = from x in MyEFTable 
        where x.CostOfLiving == "VERY HIGH" 
        select x.*; 

} 
else 
{ 
    MyObject = from x in MyEFTable 
        where x.CostOfLiving == "MODERATE" 
        select x.*; 

} 
+2

अतिरिक्त मृत क्वेरी अनावश्यक है। बस वास्तविक प्रकार लिखें। – ChaosPandion

+0

@ChosPandion मुझे लगता है कि प्रकार गुमनाम है। – CodesInChaos

+0

@CoosPandion, आपका अधिकार। – DoomerDGR8

1
List<MyObject> list = null; 

if(city == "New York City")  
    list = (from x in MyEFTable where x.CostOfLiving == "VERY HIGH" 
        select x.*).ToList();  
else  
    list = (from x in MyEFTable where x.CostOfLiving == "MODERATE" 
        select x.*).ToList();   

foreach (var item in list) 
    Console.WriteLine("<item's details>");  
4

आप एक नामित प्रकार उपयोग कर रहे हैं, बस if से पहले उस प्रकार के साथ एक चर घोषित है, लेकिन फिर सवाल तुच्छ होगा ।

तो मुझे लगता है कि आप एक अनाम प्रकार का चयन कर रहे हैं, इसलिए आप स्पष्ट रूप से उस प्रकार के साथ एक चर घोषित नहीं कर सकते हैं।

उदाहरण के द्वारा कास्ट यहां काम करेगा। लेकिन यह एक अच्छा समाधान की तरह महसूस नहीं करता है। शायद नामित प्रकार बनाना एक बेहतर विचार है।

var myObject =Enumerable.Empty<RowType>.Select(row=>select new {columnA, columnB, columnC}); 
if(city == "New York City") 
{ 
    myObject= from x in MyEFTable 
        where x.CostOfLiving == "VERY HIGH" 
        select select new {columnA, columnB, columnC}; 
} 
else 
{ 
    myObject = from x in MyEFTable 
        where x.CostOfLiving == "MODERATE" 
        select select new {columnA, columnB, columnC}; 
} 

या अपने विशिष्ट उदाहरण में एक ही सशर्त के बाद परियोजना सकता है:

IQueryable<RowType> partialQuery; 
if(city == "New York City") 
    partialQuery=MyEFTable.Where(x=>x.x.CostOfLiving == "VERY HIGH"); 
else 
    partialQuery=MyEFTable.Where(x=>x.x.CostOfLiving == "MODERATE"); 
var myObject=partialQuery.Select(x=>x.new {columnA, columnB, columnC}); 

या:

Expression<Predicate<RowType>> filter;//Note that this is an Expression, not just a delegate 
if(city == "New York City") 
    filter=x=>x.x.CostOfLiving == "VERY HIGH"; 
else 
    filter=x=>x.x.CostOfLiving == "MODERATE"; 
var myObject=MyEFTable.Where(filter).Select(x=>x.new {columnA, columnB, columnC}); 

या यहां तक ​​कि बस:

string s; 
if(city == "New York City") 
    s="VERY HIGH"; 
else 
    s="MODERATE"; 
var myObject=MyEFTable.Where(x=>x.CostOfLiving == s).Select(x=>x.new {columnA, columnB, columnC}); 

कौन सा है उचित निर्भर करता है कि आप कैसे सिंप करते हैं अपना प्रश्न बढ़ाया।

1

फ़ोरैच लूप में इसका उपयोग करने के लिए आपको कथन के दायरे के बाहर चर को घोषित करने की आवश्यकता होगी।

यदि चर घोषित किया गया है लेकिन अगर कथन के बाहर प्रारंभ नहीं किया गया है तो इसे स्पष्ट रूप से टाइप नहीं किया जा सकता है क्योंकि संकलक के पास प्रकार निर्धारित करने के लिए अभिव्यक्ति नहीं होगी।

यदि यह केवल फ़ोरैच लूप में उपयोग किया जा रहा है तो आप इसे एक आईनेमेरेबल के रूप में घोषित कर सकते हैं।

2

इस प्रयास करें:

System.Linq.IQueryable<MyEFTable Object type> MyObject = null; 
if(city == "New York City") 
{ 
    MyObject = from x in MyEFTable 
      where x.CostOfLiving == "VERY HIGH" 
      select x.*; 
} 
else 
{ 
    MyObject = from x in MyEFTable 
      where x.CostOfLiving == "MODERATE" 
      select x.*; 
} 

foreach (var item in MyObject) 
{ 
    Console.WriteLine("<item's details>"); 
} 
संबंधित मुद्दे