2012-01-06 24 views
6

Bu yöntem, genel liste döndürür, ancak seçilmesi için birden çok koşulu vardır. Sadece şunu kullanarak yazabilirim eğer - else eğer -else eğer .... çok fazla varsa ben Bunu yapmak için daha kısa bir yol var mı? Teşekkür ederim. yapabilirsinizLinq, çok koşullu yan tümce tümcelerini içeren

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

Sonuçlara ilk eriştiğinizde linq yürütüldüğü için, ilk 'birinden' '/ where' 'i bir var olana ve sonra ifs'in dışına koyabilirsiniz, yeni sorguyu alınan sonuç kümesine kullanın. – Aphelion

cevap

1

1 *

daha iyi sollution buldum ama bu yardımı (I şey) dilek ama kullanmaya: Bu işlevin dışında

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(); 

    } 
} 

testi yapabilir ve mümkün İlk listenizdeki herhangi bir koşulu uygulayın, ancak havy uygulamada veya veritabanında pek çok bilgi içinde tavsiye edilmez.

2 *

Ya da sadece ilk tarih ve son tarih yapabilir; tarih ayarlanmamışsa, ilk tarih = 01/01/1900 tarihini ve son tarihi Datetime yapın. Bugün ve tarihinizi her zaman linux sorgusunda girin

+0

aslında, değer almak için pek çok koşul düşünmeliyim ... public List GetRequestsQuery (string departmant, int reqStateID, string firstDate, string lastDate, string productName)… Bana filtrelenmiş bir cevap vermeli. Ya da bunlardan biri doğrudur, geri kalanı yanlıştır ... bu yüzden tüm olasılıkları yazmam gerek? (a & b & c & d) else (a & b & c & d) else (a & b & c) başka ise (a & c & d) else (b & c & d) ise (a & b) else (a & b) ise (a & c) else… (etc) ise? :))) – blackraist

0

Böyle bir şey derlenmedim ve kontrol etmedim ama sana bir ipucu vermeli.

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(); 
    } 

} 

DÜZENLEME:

sonra da masaya ToList() çağrısı filtrenizde olmayan sql işlevleri kullanmak istiyorsanız

bu sorun Yüklediğiniz olmasıdır
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()) 
        }) 

tüm tabloyu, eğer değerlere sık sık değiştirmezseniz ve eğer çok büyük değilse, hafızanın içine girin. Bir başka yaklaşım, muhtemelen DBA'nızı mutlu edecek şekilde saklanmış bir proc olarak yazmaktır.

+0

eğer tüm parametreler sıfır değilse, yani tüm koşullar bana filtre uygulanmış bir cevap vermesi gerektiği anlamına gelir. Bu yaklaşım için 1 koşul değer elde etmek için yeterlidir. – blackraist

6

aşağıdaki şekilde Sorgunuzun çekirdek olabilir:

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()) 
        } 

Sonra if then else geçerlidir: Bu if then else azaltmak ama ne gidiş daha mantıklı olur kılan vermez

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(); 
} 

.

+0

@Jani, Salam pesar, kojaee? bia çok google konuşma :) harika cevap için –

+1

+1 !! Avariin :-) – hsalimi

+0

de aslında, değer almak için pek çok koşul düşünmeliyim ... public List GetRequestsQuery (string departmant, int reqStateID, string firstDate, string lastDate, string productName) ....Yani bütün koşullar bana filtre uygulanmış bir cevap vermesi gerektiği anlamına gelir. Ya da bunlardan biri doğrudur, geri kalanı yanlıştır ... bu yüzden tüm olasılıkları yazmam gerek? (a & b & c & d) else (a & b & c & d) else (a & b & c) başka ise (a & c & d) else (b & c & d) ise (a & b) else (a & b) ise (a & c) else… (etc) ise? :))) – blackraist

İlgili konular