A menudo he tenido que cargar varios elementos a un registro particular en la base de datos. Por ejemplo: una página web muestra elementos para incluir en un único informe, todos los cuales son registros en la base de datos (el informe es un registro en la tabla Informe, los elementos son registros en la tabla Artículo). Un usuario selecciona elementos para incluir en un solo informe a través de una aplicación web, y digamos que seleccionan 3 elementos y los envían. El proceso agregará estos 3 elementos a este informe agregando registros a una tabla llamada ReportItems (ReportId, ItemId).Pasando List <> a SQL Stored Procedure
Actualmente, me gustaría hacer algo como esto en el código:
public void AddItemsToReport(string connStr, int Id, List<int> itemList)
{
Database db = DatabaseFactory.CreateDatabase(connStr);
string sqlCommand = "AddItemsToReport"
DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand);
string items = "";
foreach (int i in itemList)
items += string.Format("{0}~", i);
if (items.Length > 0)
items = items.Substring(0, items.Length - 1);
// Add parameters
db.AddInParameter(dbCommand, "ReportId", DbType.Int32, Id);
db.AddInParameter(dbCommand, "Items", DbType.String, perms);
db.ExecuteNonQuery(dbCommand);
}
y esto en el procedimiento almacenado:
INSERT INTO ReportItem (ReportId,ItemId)
SELECT @ReportId,
Id
FROM fn_GetIntTableFromList(@Items,'~')
Cuando la función devuelve una tabla de una columna de números enteros.
Mi pregunta es: ¿hay una mejor manera de manejar algo como esto? Tenga en cuenta que no estoy preguntando sobre la normalización de la base de datos ni nada de eso, mi pregunta se relaciona específicamente con el código.
¿Es realmente va a salvar de la concatenación? ¿Sabes si el método se implementó usando StringBuilder? –
Sí, lo salvará de la concatenación. String.Join usa un UnsafeCharBuffer para hacer el concat (mirarlo en Reflector). En lo que respecta al LINQ, eso es solo enumerar a través de la lista llamando a ToString(), que es inevitable, y crear una matriz. La creación de matriz puede ser costosa. –
No sabía que pudieras hacerlo así, ¡gracias por el consejo! –