Jak mogę skrócić mój kod?

0

Chodzi mi o te powtarzające się linijki w drugiej części funkcji. To jest poprawne rozwiązanie? A jeżeli nie to w jaki sposób fajnie utworzyć SqlCommand z zapytaniem który wstawi informacje z obiektu do bazy?

public static SqlCommand InsertWorker(Model.Worker worker, SqlConnection connection)
{
    SqlCommand command = new SqlCommand();
    command.Connection = connection;

    command.CommandText = 
        @"INSERT INTO Metadata
            (Name, Surname, Address, ContactPhone, ContactMail, Website, Description)
        VALUES 
            (@FirstName, @LastName, @Address, @Phone, @Mail, @Website, Description);
        INSERT INTO Workers
            (Role, MetadataId, Username, Password) 
        VALUES 
            (@Privliges, CAST(scope_identity() AS int), @Username, @PasswordHash);";

    command.Parameters.Add("@Privliges",    SqlDbType.Int        ).Value = worker.Privliges.Raw();
    command.Parameters.Add("@Username",     SqlDbType.NChar,   16).Value = worker.Username;
    command.Parameters.Add("@PasswordHash", SqlDbType.NChar,   40).Value = worker.PasswordHash;
    command.Parameters.Add("@FirstName",    SqlDbType.VarChar, 50).Value = worker.Personal.FirstName;
    command.Parameters.Add("@LastName",     SqlDbType.VarChar, 50).Value = worker.Personal.LastName;
    command.Parameters.Add("@Address",      SqlDbType.VarChar, 50).Value = worker.Personal.Address;
    command.Parameters.Add("@Phone",        SqlDbType.Char,    12).Value = worker.Personal.ContactPhone;
    command.Parameters.Add("@Mail",         SqlDbType.VarChar, 50).Value = worker.Personal.ContactMail;
    command.Parameters.Add("@Website",      SqlDbType.VarChar, 50).Value = worker.Personal.Website;
    command.Parameters.Add("@Description",  SqlDbType.VarChar, 50).Value = worker.Personal.Description;

    return command;
}

PS: Zapytanie w sumie sam sklejałem więc proszę o wyrozumiałość.

1

Możesz użyć od razu .AddWithValue() - wtedy linijki będą o połowę krótsze
Możesz przekazać słownik Dictionary<string, object> i w pętli dodać parametry

foreach (var parametr in new Dictionary<string, object>
{
    { "@Privliges", worker.Privliges.Raw() },
    { "@Username", worker.Username },
 /* itd ... */
})
    command.Parameters.AddWithValue(parametr.Key, parametr.Value);

z tego można zrobić extension method który będziesz mógł wywołać w kilku miejscach
ale jeżeli możesz to najlepiej jakbyś użył entity frameworka albo innego orma

1

dla zabawy napisałem klasę

    public class ParameterizedQuery : IEnumerable
    {
        public SqlCommand Command { get; private set; }
        public ParameterizedQuery(string query, SqlConnection connection)
        {
            this.Command = new SqlCommand(query, connection);
        }

        public void Add(string key, object value)
        {
            Command.Parameters.AddWithValue(key, value);
        }

        public IEnumerator GetEnumerator()
        {
            return Command.Parameters.GetEnumerator();
        }
    }

umożliwia ona na uproszczenie Twojego kodu na:

public static SqlCommand InsertWorker(Model.Worker worker, SqlConnection connection)
{
    string query = 
        @"INSERT INTO Metadata
            (Name, Surname, Address, ContactPhone, ContactMail, Website, Description)
        VALUES 
            (@FirstName, @LastName, @Address, @Phone, @Mail, @Website, Description);
        INSERT INTO Workers
            (Role, MetadataId, Username, Password) 
        VALUES 
            (@Privliges, CAST(scope_identity() AS int), @Username, @PasswordHash);";

    return new ParameterizedQuery(query, connection)
    {
        { "@Privliges", worker.Privliges.Raw() },
        { "@Username", worker.Username },
        { "@PasswordHash", worker.PasswordHash },
        { "@FirstName", worker.Personal.FirstName },
        { "@LastName", worker.Personal.LastName },
        { "@Address", worker.Personal.Address },
        { "@Phone", worker.Personal.ContactPhone },
        { "@Mail", worker.Personal.ContactMail },
        { "@Website", worker.Personal.Website },
        { "@Description", worker.Personal.Description }
    }.Command;
}

nadal jednak obstaję za entity

1 użytkowników online, w tym zalogowanych: 0, gości: 1