在数组中使用 属性 查找模型的最佳方法

Best way to find model with property in array

我有一个从 db 获得的数组:

public class Employee
{
    public long Id { get; set; }       
    public string EmployeeId { get; set; }          
}

我通过简单的查询从数据库中得到:

Employee[] employee = 
await this.unitOfWork.Employees
.Where(x => x.Id = id && (x.EmployeeId == employeeId && x.EmployeeId == "-1"))
.ToArrayAsync(cancellationToken);

对于这个 x.Id 一个可以有多个具有 EmployeeId 的模型。例如:

Employee[] employees = new Employee[]
{
    new()
    {
        Id = 1,
        EmployeeId = "5ee62bf9-a248-49e0-b828-c83eb4128ba1"
    },
    new()
    {
        Id = 1,
        EmployeeId = "f361fa2b-1749-4905-9f2f-0a167d66befc"
    },
    new()
    {
        Id = 1,
        EmployeeId = "-1"
    }
};

EmployeeId = "-1" 对于默认用户

然后我需要检查我是否找到输入的 employeeId 然后我需要 return 这个模型 或者我需要 return 具有默认 EmployeeId = "-1" 的模型。

if (employee.Length > 0)
{
    int index = Array.FindIndex(employee, x => x.EmployeeId.Equals(employeeId));
    if (index > 0)
    {
        return employee[index]);
    }
                
    index = Array.FindIndex(employee, x => x.EmployeeId == "-1");
    if (index > 0)
    {
        return return employee[index]);
    }
}

最好的方法是什么?这段代码有效,但我看到有很多 if 条件

如果默认情况下 employeeId 始终为 -1,则无需从数据库中获取它(在我看来)。

顺便说一句,解决方案是使用 FirstOrDefault 和这样的默认值:

Employee[] employee = 
await this.unitOfWork.Employees
.Where(x => x.Id = id && (x.EmployeeId == employeeId || x.EmployeeId==-1))
.ToArrayAsync(cancellationToken);

return employee.FirstOrDefault(x=>x?.EmployeeId==employeeId , employee.FirstOrDefault());

//for pre .net 6 use this
return employee.FirstOrDefault(x=>x?.EmployeeId==employeeId) ?? employee.FirstOrDefault();

正如您提到的,您的代码正在运行并且需要做一些更好的事情。

你可以改变这一切:

if (employee.Length > 0)
{
    int index = Array.FindIndex(employee, x => x.EmployeeId.Equals(employeeId));
    if (index > 0)
    {
        return employee[index]);
    }
                
    index = Array.FindIndex(employee, x => x.EmployeeId == "-1");
    if (index > 0)
    {
        return return employee[index]);
    }
}

像这样:

return employee.FirstOrDefault(e => e.EmployeeId == employeeId) ??
                     employee.FirstOrDefault(e => e.EmployeeId == "-1");