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。第一个运行良好。提到,搜索键可能是空的,然后它需要查看所有值,但是当提供了键时,它将只获取一个键查找结果。

LINQ查询中的if-else跳跃搜索策略

问题是&&;你要求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;