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);
}

Linq FindWhere子句和布尔过滤器

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

顺便说一句,你的条件逻辑真的很难理解。考虑重构你的代码。

我假设如果第一个括号中的任何条件为真,那么它将与所有国家匹配?!如果是这样,那么我可以在第一个括号中添加一个额外的表达式来检查国家id 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);

这样更有效(只在需要时添加过滤器),但也更容易理解。