2009-09-18 12 views
7

कैसे मैं संस्थाओंLinq तो वक्तव्य

sb.Append(" WHERE question.question_isdeleted = 0"); 
    if (catid != 0) 
     sb.AppendFormat(" AND (CatID IN ({0}))", catsSTR); 
    if(!string.IsNullOrEmpty(AuthorID)) 
     sb.Append(" AND (question_ownerid = @id)"); 

को LINQ में कुछ इस तरह लिखा है मुझे लगता है कि मैं सिर्फ संस्थाओं

उत्तर

14

मैं डॉट नोटेशन यहाँ का प्रयोग करेंगे:

var query = questions.Where(q => !q.IsDeleted); 

if (catId != 0) 
{ 
    query = query.Where(q => cats.Contains(q.CatID)); 
} 
if (authorId != 0) 
{ 
    query = query.Where(q => q.OwnerId == authorId); 
} 

आप थोड़ा और अधिक बस यह करने के लिए अपने खुद के विस्तार विधि लिख सकते हैं:

public static IQueryable<T> OptionalWhere<T>(
    this IQueryable<T> source, 
    bool condition, 
    Expression<Func<T,bool>> predicate) 
{ 
    return condition ? source.Where(predicate) : source; 
} 

फिर आप लिख सकते हैं:

var query = questions.Where(q => !q.IsDeleted); 
        .OptionalWhere(catId != 0, q => cats.Contains(q.CatID)) 
        .OptionalWhere(authorId != 0, q => q.OwnerId == authorId); 
+0

जॉन, वैकल्पिक विकल्प एक्सटेंशन विधि से प्यार करें। पूरी तरह से कमाल :)/मुझे चोरी है कि प्लैटिनम nugget ... –

+0

हे कुछ भयानक कोड है ... अच्छा – user161433

-1
where question.question_isdeleted = 0 
    && (catid != 0 
    ? catsStr.Contains(CatId.ToString()) 
    : question_ownerId == id) 

सुनिश्चित नहीं हैं करने के लिए LINQ में एक अगर सशर्त लिखने के लिए वाक्य रचना की जरूरत है स्ट्रिंग ऑपरेशन सही हैं, लेकिन तर्क सही दिखता है।

+0

कि संस्थाओं को LINQ का कारण कोशिश करते हैं और एसक्यूएल करने के लिए पूरे बयान, यदि 'catid' डेटाबेस में अज्ञात है जो कोई मतलब नहीं होगा अनुवाद करने के लिए होगा। इस उत्तर के साथ एक अतिरिक्त समस्या यह है कि यह 'catsStr' * या * 'question_ownerId' पर एक क्लॉज * या तो * जोड़ देगा। यही वह नहीं था जिसे पूछा गया था। –

+1

LINQ से इकाइयों में वेरिएबल एसक्यूएल में पैरा बन जाते हैं, इसलिए यहां catId का उपयोग करना कानूनी है। –

0

आप सशर्त इस तरह एक प्रश्न का निर्माण कर सकते हैं:

var query = from q in questions 
      where q.question_isdeleted 
      select q; 
if(!string.IsNullOrEmpty(AuthorID)) 
{ 
    query = from q in query 
      where q.question_ownerid == AuthorID 
      select q; 
} 

हालांकि, LINQ संस्थाओं कोई अच्छा निर्माण है कि ऑपरेटर में एसक्यूएल जैसा दिखता है ... के लिए

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