LINQ查询中的if-else跳跃搜索策略
本文关键字:跳跃 搜索策略 if-else 查询 LINQ | 更新日期: 2023-09-27 18:05:20
我试图从数据库中过滤多个属性。我用3个属性过滤。它可以是空的,也可以是任意组合的键。我试过这个代码,当我在三个步骤中过滤时,它工作得很好,
IEnumerable<Employee> ItemsList = _db.Employees.AsEnumerable().Where(e => e.Role == 2).OrderByDescending(e => e.EmployeeID);
if (!String.IsNullOrEmpty(SearchKeyByName))
{
ItemsList = ItemsList.Where(e => e.FirstName.ToLower().StartsWith(SearchKeyByName.Trim().ToLower()) || e.LastName.ToLower().StartsWith(SearchKeyByName.Trim().ToLower()) || (e.FirstName + " " + e.LastName).ToLower().StartsWith(SearchKeyByName.Trim().ToLower()));
ViewBag.Search_FullName = SearchKeyByName;
}
if (!String.IsNullOrEmpty(SearchKeyByDepartment))
{
ItemsList = ItemsList.Where(e => e.Department.DepartmentTitle.ToLower().StartsWith(SearchKeyByDepartment.Trim().ToLower()));
ViewBag.Search_Department = SearchKeyByDepartment;
}
if (!String.IsNullOrEmpty(SearchKeyByDesignation))
{
ItemsList = ItemsList.Where(e => e.Designation.ToLower().StartsWith(SearchKeyByDesignation.Trim().ToLower()));
ViewBag.Search_Designation = SearchKeyByDesignation;
}
但是我想用LINQ最小化这个3 if条件,我已经用这个代码尝试了1个
IEnumerable<Employee> ItemsList2 = (from e in _db.Employees.AsEnumerable()
where e.Role == 2
where (!String.IsNullOrEmpty(SearchKeyByName) && (e.FirstName.Trim().ToLower().StartsWith(SearchKeyByName.Trim().ToLower()) || e.LastName.ToLower().StartsWith(SearchKeyByName.Trim().ToLower()) || (e.FirstName + " " + e.LastName).ToLower().StartsWith(SearchKeyByName.Trim().ToLower())))
select e).OrderByDescending(e => e.EmployeeID);
但是过滤结果是null/empty。第一个运行良好。提到,搜索键可能是空的,然后它需要查看所有值,但是当提供了键时,它将只获取一个键查找结果。
问题是&&
;你要求SearchKeyByName
总是不空/null使用。如果SearchKeybyName
为空或缺失,您的过滤器应该保留所有记录,否则在搜索中使用它:SearchKeyByName.IsNullOrEmpty() || (rest of it)
。但是在这种情况下,您甚至可以通过使用空合并来简化它,因为每个字符串都以空字符串开始:
var ItemsList2 =
from e in _db.Employees
let loweredSearch = (SearchKeyByName ?? "").Trim().ToLower()
where
e.Role == 2
&& (
(e.FirstName + " " + e.LastName).ToLower().StartsWith(loweredSearch)
|| e.LastName.ToLower().StartsWith(loweredSearch)
)
orderby e.EmployeeID descending
select e;
但这可能更有效:
var ItemsList2 =
from e in _db.Employees
let loweredSearch = (SearchKeyByName ?? "").Trim().ToLower()
where
e.Role == 2
&& (
loweredSearch == string.Empty
|| (e.FirstName + " " + e.LastName).ToLower().StartsWith(loweredSearch)
|| e.LastName.ToLower().StartsWith(loweredSearch)
)
orderby e.EmployeeID descending
select e;