如何使用谓词构建器返回满足某些搜索条件的活动用户?

问题描述

我正在使用custom serializer构建动态EF谓词。

我想返回其名字或姓氏与请求的搜索词匹配的所有活动用户。这是我尝试过的方法,但我总是会得到所有活动用户...这意味着搜索不会被搜索词缩小范围:

string searchTerm = "John"; // <-- comes from user
predicate = predicate.And(u => u.IsActive == true);

if (!string.IsNullOrEmpty(searchTerm))
{
    predicate = predicate.Or(u => u.FirstName.Contains(searchTerm));
    predicate = predicate.Or(u => u.LastName.Contains(searchTerm));
}

解决方法

将您的逻辑分解为一个简单的布尔表达式-

x = IsActive == true
y = FirstName match
z = LastName match

您的逻辑是x or y or z。如果用户处于活动状态,他们将返回。

您想要x and (y or z)。在您的if语句中,类似-

predicate = predicate.And(u => u.FirstName.Contains(searchTerm) || u.LastName.Contains(searchTerm));