2013-03-26 151 views
3

我必須在此過濾器中添加以下內容:Linq FindWhere子句和布爾過濾器?

「如果CountryID通過等於(999),那麼搜索應該搜索所有國家,而不是按國家過濾。」

我現在擁有的是這個,這完全讓我困惑。

var query = rep. 
    FindWhere(c => 
     (
      countryID.HasValue == false || 
      c.CityID == null || 
      c.Countries.ID == countryID 
     ) 
     && 
     (
      mediaTypeID == 0 || 
      c.MediaTypeID == mediaTypeID 
     ) 
     && c.Active); 

我假設,如果任何關於第一個禁忌症的條件是真的,那麼它會匹配所有國家?!如果是這樣,那麼我可以在第一個parantheses中添加一個額外的表達式來檢查countryID 999?

ps。 FindWhere是:

public IQueryable<T> FindWhere(Expression<Func<T, bool>> predicate) 
{ 
    return _dbSet.Where(predicate); 
} 
+5

什麼是FindWhere? – 2013-03-26 15:05:19

+0

請檢查更新 – Xerxes 2013-03-26 15:06:28

回答

4
rep.FindWhere(c => (c.CityID == null || !countryID.HasValue || 
        countryID == 999 || c.Countries.ID == countryID) && 
        (mediaTypeID == 0 || c.MediaTypeID == mediaTypeID)) 

順便說一句,你的條件邏輯真的很難理解。考慮重構你的代碼。

3

林假設,如果任何在第一括號中的條件爲真,那麼它將匹配對所有的國家?如果是這樣,那麼我可以在第一個parantheses中添加一個額外的表達式來檢查countryID 999?

這應該有效。目前,謂詞要求前三個條件中的任何一個爲真(countryIDnull或指定的國家或城市爲null),然後檢查是否存在第二個條件。

如果您使用999進行國家/地區檢查,可以有效地「移除」過濾器,那麼在999上添加檢查將允許第一條標準始終通過。

這就是說,我個人寧願打破這一點。既然你已經使用IQueryable<T>,你可以選擇添加過濾器:

var query = rep.FindWhere(c => c.Active); 
if (mediaType != 0) 
    query = query.Where(c => c.MediaTypeID == mediaTypeID); 
if (countryID != 999) 
    query = query.Where(c => countryID.HasValue == false || c.CityID == null || c.Countries.ID == countryID); 

這是更有效的(只添加如果需要,過濾器),也更容易理解。