2009-01-14 8 views
32
में

यह तो वरना सशर्त उपयोग करने के लिए एक LINQ क्वेरी में संभव है?वरना तो LINQ

कुछ

तरह
from p in db.products 
if p.price>0 
select new 
{ 
    Owner=from q in db.Users 
     select q.Name 
} 
else 
select new 
{ 
    Owner = from r in db.ExternalUsers 
      select r.Name 
} 

उत्तर

51

यह काम हो सकता है ...

from p in db.products 
    select new 
    { 
     Owner = (p.price > 0 ? 
      from q in db.Users select q.Name : 
      from r in db.ExternalUsers select r.Name) 
    } 
+2

यह है कि अगर काम करता है ... अगर यह देखने के लिए दिलचस्प हो जाएगा करता है, मुझे टीएसक्यूएल देखना पसंद है (माना जाता है कि यह उत्सुक लोडिंग करता है; आलसी लोडिंग के लिए, शायद बहुत भयानक नहीं)। –

+1

यह काम करना चाहिए। "?:" का अनुवाद "केस" अभिव्यक्ति में किया गया है और वहां उप-सामान हैं। –

+1

नहीं करना चाहिए। यह पुष्टि करना अच्छा लगेगा कि यह काम करता है। अगर यह बहुत उपयोगी है। –

7

मैं db से मान लें कि इस LINQ करने वाली एसक्यूएल/इकाई की रूपरेखा/समान (नहीं LINQ करने वाली वस्तुओं) है;

आम तौर पर, आप सशर्त वाक्यविन्यास (ए? बी: सी) के साथ बेहतर करते हैं - हालांकि, मुझे नहीं पता कि यह आपके विभिन्न प्रश्नों के साथ काम करेगा या नहीं (आखिरकार, आप टीएसक्यूएल कैसे लिखेंगे?) ।

बात के प्रकार की एक तुच्छ उदाहरण के लिए आप कर सकते हैं कार्य करें:

select new {p.PriceID, Type = p.Price > 0 ? "debit" : "credit" }; 

आप अधिक बेहतर काम कर सकते हैं, लेकिन मैं वास्तव में संदेह आप सशर्त में तालिका चुन सकते हैं। आप की कोशिश करने, बेशक स्वागत है ...

3

उत्तर ऊपर जटिल Linq अभिव्यक्ति के लिए उपयुक्त नहीं है। आप सभी की जरूरत है:

// set up the "main query" 
var test = from p in _db.test select _db.test; 
// if str1 is not null, add a where-condition 
if(str1 != null) 
{ 
    test = test.Where(p => p.test == str); 
} 
1

आप इस तरह बदलना चाहिए:

private string getValue(float price) 
{ 
    if(price >0) 
     return "debit"; 
    return "credit"; 
} 

//Get value like this 
select new {p.PriceID, Type = getValue(p.Price)}; 
1

मेरी उदाहरण:

companyNamesFirst = this.model.CustomerDisplayList.Where(a => a.CompanyFirst != null ? a.CompanyFirst.StartsWith(typedChars.ToLower())) : false).Select(b => b.CompanyFirst).Distinct().ToList();