Мне нужен совет для моего кода. Что я хочу сделать, так это вставить строку в таблицу, используя Entity Framework Core в ASP.NET Core.

Прежде чем вставлять новые данные, я хочу проверить, используются ли уже электронная почта и номер телефона.

Я хочу вернуться конкретно, например, если return = x, используется электронная почта. Если return = y, телефон используется.

Вот мой код

public int Insert(Employee employee)
{
    var checkEmail = context.Employees.Single(e => e.Email == employee.Email);

    if (checkEmail != null)
    {
        var checkPhone = context.Employees.Single(e => e.Phone == employee.Phone);

        if (checkPhone != null)
        {
            context.Employees.Add(employee);
            context.SaveChanges();
            return 1;
        }

        return 2;
    }

    return 3;
}

Я не уверен в своем коде, есть ли какие-либо советы по лучшей практике в моем случае?

2
Muhammad Rifqi 23 Дек 2021 в 09:04

2 ответа

Мне просто не нравятся эти "магические числа", указывающие на результат ваших проверок.... как вы или как кто-то еще узнает, что означает 1 или 2, 6 месяцев назад дорога отныне??

Я бы предложил либо, по крайней мере, создать класс констант, который сделает более очевидным, что означают эти числа:

public class CheckConstants
{
    public const int Successful = 1;
    public const int PhoneExists = 2;
    public const int EmailExists = 3;
}

А затем используйте эти константы в своем коде:

public int Insert(Employee employee)
{
    var checkEmail = context.Employees.Single(e => e.Email == employee.Email);

    if (checkEmail != null)
    {
        var checkPhone = context.Employees.Single(e => e.Phone == employee.Phone);

        if (checkPhone != null)
        {
            context.Employees.Add(employee);
            context.SaveChanges();

            return CheckConstants.Successful;
        }

        return CheckConstants.PhoneExists;
    }

    return CheckConstants.EmailExists;
}

А также в любом коде, который вызывает этот метод и должен знать код состояния возврата.

В качестве альтернативы вы также можете изменить это на enum (вместо int):

public enum CheckConstants
{
    Successful, PhoneExists, EmailExists
}

А затем просто верните это перечисление - вместо int - из вашего метода:

public CheckConstants Insert(Employee employee)
{
    var checkEmail = context.Employees.Single(e => e.Email == employee.Email);

    if (checkEmail != null)
    {
        var checkPhone = context.Employees.Single(e => e.Phone == employee.Phone);

        if (checkPhone != null)
        {
            context.Employees.Add(employee);
            context.SaveChanges();

            return CheckConstants.Successful;
        }

        return CheckConstants.PhoneExists;
    }

    return CheckConstants.EmailExists;
}
1
marc_s 23 Дек 2021 в 09:16
Спасибо за ваш отзыв. Я думаю, что то же самое с моим кодом, но разница в том, что нам нужно определить константу для обработки возвращаемого типа.
 – 
Muhammad Rifqi
24 Дек 2021 в 06:27
  1. объединить две проверки базы данных в один запрос

  2. использовать экземпляр SingleOrDefault Single

    public int Insert(Employee employee)
    {
        var checkEmail = context.Employees.Select (e=>new {e.Email , e.Phone }).SingleOrDefault(e => e.Email == employee.Email || e.Phone == employee.Phone);
    
        if (checkEmail == null)
        {
            context.Employees.Add(employee);
            context.SaveChanges();
            return 1;
        }
        else if (checkEmail.Email == employee.Email)
            return 3;
        else
            return 2;
    }
    
0
marc_s 23 Дек 2021 в 09:16