私は価値を得るために複数の条件を考慮する必要があります。 私はフィルタリングされた答えを与えなければならないすべての条件が真である場合は意味します。 またはそのうちの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
}
動作していない場合は1つだけ追加します!!!私を助けるためにあなたの時間を取ってくれてありがとう。 – blackraist
これはまずメインテーブルから100万のアイテムすべてを取り出し、アプリケーションにフィルタを適用するのではありませんか? 。 。 。 SQLプロファイラを実行する場合は、フィルタが適用された状態でデータベースにヒットし、フィルタ条件を満たす行のみがアプリケーションに返されます(この条件を満たす100万行のうち50行のみが返されます) ? –
@AshishAnand Linqは遅延実行を使用するため、 '.ToList()'が呼び出されるまでクエリは実行されません。 – cadrell0