2013-03-26 66 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); 

这是更有效的(只添加如果需要,过滤器),也更容易理解。