Eu tenho algum código em C # que estou tentando mover para um procedimento armazenado - o Sql Azure não gosta de várias chamadas. Portanto, tudo precisa ser movido para um proc.
Aqui está o código C#:
List<string> addList = new List<string>(EmailDomains);
List<string> deleteList = new List<string>();
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.Transaction = transaction;
cmd.CommandText = "select * from CompanyDomains where CompanyDomains.CompanyId = @CompanyId";
DbUtilities.AddParam(cmd, "@CompanyId", CompanyId);
using (IDataReader reader = cmd.ExecuteReader())
{
int ordinal = reader.GetOrdinal("EmailDomain");
while (reader.Read())
{
string domain = reader.GetString(ordinal).Trim();
if (! addList.Remove(domain))
{
deleteList.Add(domain);
}
}
}
}
foreach (string domain in deleteList)
{
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.Transaction = transaction;
cmd.CommandText =
"delete from CompanyDomains where CompanyDomains.CompanyId = @CompanyId and CompanyDomains.EmailDomain = @EmailDomain";
DbUtilities.AddParam(cmd, "@CompanyId", CompanyId);
DbUtilities.AddParam(cmd, "@EmailDomain", domain);
cmd.ExecuteNonQuery();
}
}
// deleted domains get added/updated to DeletedCompany
foreach (string domain in deleteList)
{
DeletedCompany.InsertOrUpdate(conn, transaction, domain, CompanyName);
}
foreach (string domain in addList)
{
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.Transaction = transaction;
cmd.CommandText = "insert into CompanyDomains (CompanyId, EmailDomain) " +
"values (@CompanyId, @EmailDomain)";
DbUtilities.AddParam(cmd, "@CompanyId", CompanyId);
DbUtilities.AddParam(cmd, "@EmailDomain", domain.Trim());
cmd.ExecuteNonQuery();
}
}
// added domains get removed from DeletedCompany
foreach (string domain in addList)
{
using (IDbCommand cmd = conn.CreateCommand())
{
if (transaction != null)
cmd.Transaction = transaction;
cmd.CommandText = "delete from DeletedCompany where DeletedCompany.Domain = @Domain";
DbUtilities.AddParam(cmd, "@Domain", domain);
cmd.ExecuteNonQuery();
}
}
O que estou totalmente parado é que não vejo nenhum equivalente de uma lista é SQL. Existe uma maneira de construir tudo isso em uma lista?
Ou existe um delete/insert/update que eu possa fazer onde o select usa a lista que eu passo? Estou passando uma lista na forma de um tipo definido(tabela) que é a nova lista de domínios. Dessa lista:
Qualquer domínio na lista passada que não esteja em CompanyDomains é adicionado a CompanyDomains.
Qualquer domínio na tabela CompanyDomains que não esteja na lista passada é 1) removido de CompanyDomains e 2) adicionado/atualizado à tabela DeletedCompany.
Qualquer domínio que esteja no liast e na tabela DeletedCompany é excluído da tabela DeletedCompany.
A coluna DeletedCompany.Domain é exclusiva nessa tabela. Portanto, adições a ele devem ser um upsert.
A tabela CompanyDomains também tem uma coluna CompanyId e tudo ali onde CompanyDomains.CompanyId = @CompanyId (passado em parâmetro para o proc).
Isso é para Sql Server 2008 e Sql Azure. Ele não precisa ser executado em mais nada.
obrigado - dave
Portanto, a
list
no SQL Server é basicamente uma tabela. Você pode usar parâmetros com valor de tabela para transmitir sua lista completa de C#. Basicamente você apenas cria um tipo de tabela para definir aquela lista que você está passando, veja o exemplo no link do MSDN.Você só precisaria pegar cada requisito listado em sua pergunta ou que o C# está executando e escrever a consulta para extrair os valores corretos de sua lista de valores tabelados e criar suas instruções
INSERT
,DELETE
eUPDATE
com base nesses valores.Então para
Algo como: