c# - nombre - merge tags first name
La mejor forma de vincular datos a una lista con contenido sub relacionado(por ejemplo, preguntas de SO con etiquetas) (2)
Usando ASP.net 2.0, ¿cómo presento la información al usuario de manera similar a la lista de preguntas en SO, donde cada pregunta tiene algunos elementos secundarios (como las etiquetas).
Probablemente estaría haciendo dos consultas por separado, una para encontrar primero la lista de preguntas, luego otra consulta para encontrar todas las etiquetas que pertenecían a la lista de preguntas.
Enfoque 1:
Entonces probablemente estaría usando repetidores anidados y haciendo una declaración de selección en el código subyacente en cada repetidor anidado "OnItemDataBind" ...
Enfoque 2:
O con los dos conjuntos de datos, usaría el código C # para crear una entidad comercial de cada una de las "Preguntas" y tendría una propiedad llamada "Etiquetas". Luego recorría mi conjunto de datos de etiquetas y asignaba la propiedad.
¿Qué es más eficiente? ¿Hay alguna otra alternativa?
Definitivamente, evitaría el segundo enfoque: no querrá acceder a la base de datos cada vez que enlace un elemento principal. Como dice DOK, intenta diseñar tu sistema correctamente. Para mí eso significaría poblar una colección de objetos comerciales y vincularlos. Hago algo similar con un control de menú personalizado (tenga en cuenta que anida tres datalists, pero podría usar repetidores):
En la página aspx:
<asp:DataList ID="dlMenuOne" runat="server" onitemdatabound="dlMenu_ItemDataBound" >
<ItemTemplate>
//your object
<asp:DataList ID="dlMenuTwo" runat="server" onitemdatabound="dlMenuTwo_ItemDataBound">
<ItemTemplate>
//your object''s child items
<asp:DataList ID="dlMenuThree" runat="server">
<ItemTemplate>
//child item''s child items
</ItemTemplate>
</asp:DataList>
</ItemTemplate>
</asp:DataList>
</ItemTemplate>
</asp:DataList>
luego en el código detrás:
protected void dlMenu_ItemDataBound(object sender, DataListItemEventArgs e)
{
DataListItem parentList = e.Item;
DataList dlMenuTwo = (DataList)parentList.FindControl("dlMenuTwo");
MenuItem item = (MenuItem)parentList.DataItem;
dlMenuTwo.DataSource = _menu.GetChildItems(item);
dlMenuTwo.DataBind();
}
este método básicamente obtiene una referencia al objeto que se enlaza (parentList.DataItem) y luego vincula la DataList anidada a los elementos secundarios (_menu.GetChildItems (item))
Si realiza dos consultas por separado, puede hacerlas en una sola llamada a la base de datos y obtener dos resultados.
En lugar de DataSets, podría usar el DataReader más eficiente (con dos conjuntos de resultados). Pasa por los conjuntos de resultados y rellena objetos de preguntas con propiedades o objetos de etiqueta asociados. Coloque esos objetos en una ArrayList o en una Lista genérica, y puede vincularla a su Repeater.
En lugar de hacer cualquier cosa en código subyacente, debería considerar mover ese código al menos a una capa de acceso a datos (clase) si no necesita una capa de lógica de negocios (otra clase).
Todas estas sugerencias solo se aplican si su aplicación no es trivial. El uso de métodos OO se agrega al código, pero si está haciendo algo más que mostrar la información, sería mejor comenzar con una buena arquitectura OO (DAL y BLL, si no es MVC).