2012-01-06 14 views
6

यह विधि जेनेरिक सूची देता है लेकिन इसमें चयन करने के लिए कई स्थितियां हैं। मैं बस इसका उपयोग कर लिख रहा हूं - अगर अन्यथा अगर .... अगर बहुत कुछ है तो मेरा मतलब है क्या ऐसा करने का एक छोटा रास्ता है? धन्यवाद।लिंक जहां कई स्थितियों के साथ खंड

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate) 
    { 
     var db = new requestsDBEntities(); 
     var listPrn = new List<ProductReqNoDate>(); 
     if (!string.IsNullOrEmpty(departmant)) 
     { 
      return (from r in db.requests 
         where r.departmant== departmant 
         select new ProductReqNoDate 
         { 
          departmant= r.departmant, 
          reqNo = r.reqNo , 
          reqDate = r.reqDate , 
          prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
         }).ToList(); 

     } 
     if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
     { 
      DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
      DateTime dtlastDate = Convert.ToDateTime(lastDate); 
      return (from r in db.requests 
         where r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate 
         select new ProductReqNoDate 
         { 
          departmant= r.departmant, 
          reqNo = r.reqNo , 
          reqDate = r.reqDate, 
          prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
         }).ToList(); 

     } 
    } 
+0

जैसा कि पहली बार परिणामों तक पहुंचने पर लिनक निष्पादित किया जाता है, शायद आप पहले से 'से/कहां' को एक var में डाल सकते हैं और फिर ifs के बाहर, पुनर्प्राप्त परिणाम सेट पर चयनित नई क्वेरी का उपयोग कर सकते हैं। – Aphelion

उत्तर

1

1 *

आप कर सकते हैं बेहतर sollution पाया, लेकिन मैं इस मदद (मैं बात) चाहते हैं, लेकिन मैं इसे का उपयोग करें: आप

List<ProductReqNoDate> yourList = GetRequestsQuery(string departmant, int reqStateID) 

    if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
    { 
     yourdatagrid.Itemsource = yourList.where(a=> a.reqDate <= Datetime.parse(firstDate) & a.reqDate >= Datetime.parse(lastDate)) 
    } 


public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID) 
{ 
    var db = new requestsDBEntities(); 
    var listPrn = new List<ProductReqNoDate>(); 
    if (!string.IsNullOrEmpty(departmant)) 
    { 
     return (from r in db.requests 
        where r.departmant== departmant 
        select new ProductReqNoDate 
        { 
         departmant= r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        }).ToList(); 

    } 
} 

इस समारोह बाहर परीक्षण कर सकते हैं और आप कर सकते हैं अपनी पहली सूची में किसी भी शर्त को लागू करें लेकिन डेटाबेस में भारी जानकारी या कई जानकारी में अनुशंसित नहीं है।

2 *

या फिर आप पहली तारीख और अंतिम तारीख कर सकते हैं; उदाहरण के लिए सेट होने पर उदाहरण के लिए, पहली तारीख = 01/01/1900 और अंतिम तिथि डेटाटाइम बनाएं। आज और हमेशा अपनी तिथि को linq क्वेरी

+0

वास्तव में, मुझे मूल्य प्राप्त करने के लिए कई स्थितियों पर विचार करने की आवश्यकता है ... सार्वजनिक सूची GetRequestsQuery (स्ट्रिंग प्रस्थानकर्ता, int reqStateID, स्ट्रिंग firstDate, स्ट्रिंग lastDate, स्ट्रिंग productName) .... मेरा मतलब है कि सभी शर्तें सच हैं मुझे एक फ़िल्टर जवाब देना चाहिए। या उनमें से एक सच है, बाकी झूठे हैं ... तो मुझे सभी संभावनाएं लिखने की ज़रूरत है ?? अगर (ए और बी और सीएंडडी) अन्यथा (ए और बी और सी) अन्य यदि (ए और सी एंड डी) अन्यथा (बी और सी और डी) अन्य यदि (ए और बी) अन्य यदि (ए और सी) ... आदि ?? :))) – blackraist

0

इस तरह से कुछ मैंने संकलित नहीं किया है और इसे चेक नहीं किया है लेकिन यह आपको एक सुराग देना चाहिए।

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate) 
{ 
    using(var db = new requestsDBEntities()) 
    { 

     DateTime dtfirstDate =null; 
     DateTime.TryParse(firstDate,out dtfirstDate); 

     DateTime dtlastDate = null; 
     DateTime.TryParse(lastDate,out dtlastDate); 

     var result = (from r in db.requests 
        where 
         (r.departmant == departmant) 
        || (r.reqDate <= dtlastDate.Value && r.reqDate >= dtfirstDate.Value) 
        select new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        }).ToList(); 
    } 

} 

संपादित करें:

आपके फ़िल्टर में गैर एसक्यूएल कार्यों का उपयोग करने के लिए तो अपनी मेज पर ToList() फोन चाहते हैं, तो

var result = db.requests.ToList().Where(r => { 

    // do test for what you want 
    // so write a function to work out when you want to filter by 
    // name or date 
    return true; 

}).Select(r => new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter(db.products.Where(p=> p.reqNo == r.reqNo).Select(p=> p.prdctName).FirstOrDefault()) 
        }) 

इस के साथ समस्या यह है कि आप लोड कर रहे हैं है पूरी तालिका मेमोरी में जो ठीक है अगर आप इसमें मूल्यों में बदलाव नहीं करते हैं और यदि यह बहुत बड़ा नहीं है।

एक अन्य दृष्टिकोण इसे एक संग्रहित प्रो के रूप में लिखना होगा जो संभवतः आपके डीबीए को खुश कर देगा।

+0

क्या होगा यदि सभी पैरामीटर शून्य नहीं हैं, मेरा मतलब है कि अगर सभी स्थितियां सच हैं तो मुझे फ़िल्टर फ़िल्टर देना होगा। इस दृष्टिकोण के लिए 1 शर्त मूल्य प्राप्त करने के लिए पर्याप्त है। – blackraist

6

आप निम्नलिखित के रूप में आपकी क्वेरी के मूल हो सकता है:

var query = from r in db.requests 
select new ProductReqNoDate 
        { 
         departmant= r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products 
         where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        } 

फिर if then else लागू होते हैं:

if (!string.IsNullOrEmpty(departmant)) 
    return query.Where(r=>r.departmant== departmant).ToList(); 
if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
{ 
     DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
     DateTime dtlastDate = Convert.ToDateTime(lastDate); 
     return query.Where(r=> r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate) 
        .ToList(); 
} 

यह if then else को कम नहीं करता है लेकिन अधिक समझदार, क्या चल रहा होता है बनाता है।

+0

@ जेनी, सलाम पेसर, कोज़ी? बाया भी गूगल टॉक :) –

+1

+1 अपने शानदार जवाब के लिए !!!! Avariin :-) – hsalimi

+0

वास्तव में, मुझे मूल्य प्राप्त करने के लिए कई स्थितियों पर विचार करने की आवश्यकता है ... सार्वजनिक सूची GetRequestsQuery (स्ट्रिंग प्रस्थानकर्ता, int reqStateID, स्ट्रिंग firstDate, स्ट्रिंग lastDate, स्ट्रिंग productName) ....मेरा मतलब है कि अगर सभी स्थितियां सच हैं तो मुझे एक फ़िल्टर जवाब देना चाहिए। या उनमें से एक सच है, बाकी झूठे हैं ... तो मुझे सभी संभावनाएं लिखने की ज़रूरत है ?? अगर (ए और बी और सीएंडडी) अन्यथा (ए और बी और सी) अन्य यदि (ए और सी एंड डी) अन्यथा (बी और सी और डी) अन्य यदि (ए और बी) अन्य यदि (ए और सी) ... आदि ?? :))) – blackraist

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