我有一个搜索用户列表的函数,包括用户名、用户地址、以前的地址和电话号码。 一旦我有了这些用户信息,我就可以过滤他们的用户名、地址、以前的地址或电话号码。 当我获取用户结果并筛选特定电话号码时,筛选器会返回正确的电话号码和其他相关信息。
当我搜索没有电话号码的用户名时出现问题。因此,当我搜索用户名然后过滤特定用户名时,结果为空。
例如,如果我搜索用户名"John",我会得到 100 个与该用户名及其用户名、上一个地址和电话号码匹配的结果。 过滤 John123 没有任何问题。
但是,如果我搜索"Mary",并尝试针对特定用户名进行过滤,则不会返回任何结果。这是因为所有带有"Mary"的用户名都没有电话号码。
下面的代码是我尝试过的,它没有按预期工作。有人可以看看并告诉我哪里出错了吗?
var finalResult = context.User
.Select(x => new UserModel()
{
UserName = x.Name,
UserAddress = x.Address,
PreviousAddress = x.PAddress,
PhoneNumber = x.PhoneNumbers.Select(y => y.PersonalNumber),
}).AsQueryable();
if (!string.IsNullOrWhiteSpace(search.UserName))
{
finalResult = finalResult.Where(x => EF.Functions.Like(x.UserName, $"%{search.UserName}%"));
if (search.UserNameFilter != "" || search.PhoneNumberFilter != "")
{
finalResult = finalResult.Where(x =>
((EF.Functions.Like(x.PhoneNumber.FirstOrDefault(), $"%{search.PhoneNumberFilter}%")) &&
EF.Functions.Like(x.UserName, $"%{search.UserName}%") &&
EF.Functions.Like(x.UserName, $"%{search.UserNameFilter}%") &&
EF.Functions.Like(x.PreviousAddress, $"%{search.PreviousAddressFilter}%") &&
EF.Functions.Like(x.UserAddress, $"%{search.UserAddressFilter}%")));
return finalResult;
}
return finalResult;
}
拆分测试并分别使用if
保护每个过滤器:
var finalResult = context.User
.Select(x => new UserModel() {
UserName = x.Name,
UserAddress = x.Address,
PreviousAddress = x.PAddress,
PhoneNumber = x.PhoneNumbers.Select(y => y.PersonalNumber),
});
if (!String.IsNullOrWhiteSpace(search.UserName))
finalResult = finalResult.Where(x => EF.Functions.Like(x.UserName, $"%{search.UserName}%"));
if (search.UserNameFilter != "")
finalResult = finalResult.Where(x => EF.Functions.Like(x.UserName, $"%{search.UserNameFilter}%"));
if (search.PhoneNumberFilter != "")
finalResult = finalResult.Where(x => EF.Functions.Like(x.PhoneNumber.FirstOrDefault(), $"%{search.PhoneNumberFilter}%"));
if (search.PreviousAddressFilter != "")
finalResult = finalResult.Where(x => EF.Functions.Like(x.PreviousAddress, $"%{search.PreviousAddressFilter}%"));
if (search.UserAddressFilter != "")
finalResult = finalResult.Where(x => EF.Functions.Like(x.UserAddress, $"%{search.UserAddressFilter}%"));
return finalResult;
PS 不要在IQueryable
上打电话给AsQueryable
- 始终了解您的类型。