Linq FindWhere子句和布尔过滤器
本文关键字:布尔 过滤器 子句 FindWhere Linq | 更新日期: 2023-09-27 18:06:09
我必须添加以下内容到这个过滤器,
"如果传入的CountryID等于(999),那么搜索应该搜索所有国家,而不是按国家过滤。"
我目前拥有的是这个,这完全让我困惑。
var query = rep.
FindWhere(c =>
(
countryID.HasValue == false ||
c.CityID == null ||
c.Countries.ID == countryID
)
&&
(
mediaTypeID == 0 ||
c.MediaTypeID == mediaTypeID
)
&& c.Active);
我假设如果第一个括号中的任何条件为真,那么它将与所有国家匹配?!如果是这样,那么我可以在第一个括号中添加一个额外的表达式来检查国家id 999?
p。FindWhere是:
public IQueryable<T> FindWhere(Expression<Func<T, bool>> predicate)
{
return _dbSet.Where(predicate);
}
rep.FindWhere(c => (c.CityID == null || !countryID.HasValue ||
countryID == 999 || c.Countries.ID == countryID) &&
(mediaTypeID == 0 || c.MediaTypeID == mediaTypeID))
顺便说一句,你的条件逻辑真的很难理解。考虑重构你的代码。
我假设如果第一个括号中的任何条件为真,那么它将与所有国家匹配?!如果是这样,那么我可以在第一个括号中添加一个额外的表达式来检查国家id 999?
这应该可以工作。现在,谓词要求前三个条件中的任何一个为真(countryID
是null
或指定的国家,或者城市是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);
这样更有效(只在需要时添加过滤器),但也更容易理解。