2012-01-06 18 views
1

私は価値を得るために複数の条件を考慮する必要があります。 私はフィルタリングされた答えを与えなければならないすべての条件が真である場合は意味します。 またはそのうちの1つが真、残りは偽です... だから私はすべての可能性を書く必要がありますか? IF(& B & & C D)他他(& & B C)もしそうでなければ(& & C d)の場合(C & & D B)他の場合(そうでなければ(& b)の場合& c)...など? :)))これを行うには、より短い方法がありますか?複数の条件Linq拡張

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate, string productName) 
    { 
     var db = new requestDBEntities(); 
     bool dp = !string.IsNullOrEmpty(departmant); 
     bool pr = !string.IsNullOrEmpty(productName); 
     bool tm = !string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate); 
     bool rs = reqStateID > 0 ? true : false; 

     var query = (from r in db.requests 
        select new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo, 
         reqDate = r.reqDate, 
         productName = (from p in db.products where p.reqNo == r.reqNo select p.productName).FirstOrDefault() 
        }).ToList(); 
     if (dp & pr & tm & rs) 
     { 
      var rState = (from ta in db.reqStates 
          where ta.reqStateID == reqStateID && ta.isActive == true 
          select ta.reqNo).ToList(); 
      var prName = (from p in db.products where p.productName.Contains(productName) select p.reqNo).ToList(); 
      DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
      DateTime dtlastDate = Convert.ToDateTime(lastDate); 

      return query.Where(
       r => rState.Contains(r.reqNo) //find by Request State 
        && r.departmant == departmant //find by Departmant 
        && (r.reqDate >= dtfirstDate && r.reqDate <= dtlastDate) //find by Date 
        && prName.Contains(r.reqNo) //Find By Product Name 
        ).ToList(); 

     } 
     else if (dp & pr & tm) { /*return query.Where(...} */} 
     else if (pr & tm & rs) { /*return query.Where(...} */} 
     else if (dp & pr && rs) { /*return query.Where(...} */} 
     else if (dp & pr) { /*return query.Where(...} */} 
     //else if ...etc 
    } 

答えて

3

時の条件

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate, string productName) 
{ 
    var db = new requestDBEntities(); 
    bool dp = !string.IsNullOrEmpty(departmant); 
    bool pr = !string.IsNullOrEmpty(productName); 
    bool tm = !string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate); 
    bool rs = reqStateID > 0 ? true : false; 

    var query = (from r in db.requests 
       select new ProductReqNoDate 
       { 
        departmant = r.departmant, 
        reqNo = r.reqNo, 
        reqDate = r.reqDate, 
        productName = (from p in db.products where p.reqNo == r.reqNo select p.productName).FirstOrDefault() 
       }).AsQueryable(); //AsQueryable is not always needed, but it shouldn't hurt and I don't feel like checking for this example. 


    if (dp) 
    { 
     query = query.Where(q => /*condition*/); 
    } 

    if (pr) 
    { 
     query = query.Where(q => /*condition*/); 
    } 

    if (tm) 
    { 
     query = query.Where(q => /*condition*/); 
    } 

    if (rs) 
    { 
     query = query.Where(q => /*condition*/); 
    } 

    return query.ToList(); 
} 
+0

動作していない場合は1つだけ追加します!!!私を助けるためにあなたの時間を取ってくれてありがとう。 – blackraist

+0

これはまずメインテーブルから100万のアイテムすべてを取り出し、アプリケーションにフィルタを適用するのではありませんか? 。 。 。 SQLプロファイラを実行する場合は、フィルタが適用された状態でデータベースにヒットし、フィルタ条件を満たす行のみがアプリケーションに返されます(この条件を満たす100万行のうち50行のみが返されます) ? –

+1

@AshishAnand Linqは遅延実行を使用するため、 '.ToList()'が呼び出されるまでクエリは実行されません。 – cadrell0

1

あなたが好きExpression.Andとの表現を構築することができます

private Expression<Func<Request, bool>> GetPredicate(FilterDto filter) 
{ 
    Expression<Func<Request, bool>> predicate = r => r.ID == r.ID; 

    if (filter.Department.HasValue) 
    predicate = predicate.And(r => r.Department == filter.Department.Value); 
    if (filter.FirstDate.HasValue) 
    predicate = predicate.And(r => (r.reqDate >= filter.FirstDate.Value)); 
    if (filter.LastDate.HasValue) 
    predicate = predicate.And(r => (r.reqDate <= filter.LastDate.Value)); 

    /* ... */ 

    return predicate; 
} 

注:私はちょうどに開始するための式を持つように、最初の式として、ここでr => r.ID == r.IDを置きます。このスニペットはあなたのコードを完全にカバーしていませんが、例として十分です。

return query.Where(expression).ToList()の式を使用してください。

+0

predicate.Andが、それは魔法のように動作 – Prabu