Pregunta

Estoy escribiendo una etiqueta basada en ASP.net sistema.Utilizando la siguiente db esquema:

Topic <many-many> TagTopicMap <many-many> Tag

Básicamente se trata de un 3NF enfoque (toxi) que he encontrado de la siguiente: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html

Aquí está el fragmento de código que me han dado:

DataLoadOptions options = new DataLoadOptions();
        options.LoadWith<Topic>(t => t.TagTopicMaps);
        options.LoadWith<TagTopicMap>(tt => tt.Tag);
        var db = new lcDbDataContext();
        db.LoadOptions = options;
        db.Log = w;

        var x = from topic in db.Topics
                orderby topic.dateAdded descending
                select topic;

        ViewData["TopicList"] = x.Take(10);

Cuando me la ejecución de este, el resultado está muy bien, pero viene con 11 solo consultas SQL, uno para obtener la lista de los 10 mejores temas:

    SELECT TOP (10) [t0].[Id], [t0].[title], [t0].[dateAdded]
FROM [dbo].[Topics] AS [t0] ORDER BY [t0].[dateAdded] DESC
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1 

Y el 10 de los otros para obtener detalles de las etiquetas de forma individual.

He probado a cambiar los dos loadwith declaraciones de encendido y apagado, y encontrar los siguientes:

loadwith<topic> : no difference for on or off.
loadwith<tagtopicmap>: 11 Queries when on, much more when off.

En resumen, SÓLO la segunda loadwith opción está funcionando como se esperaba.El primero no tiene ningún efecto!!!!

También traté de hacer que el conjunto de resultados ToList().Pero aún más el problema viene de fuera:para las etiquetas de la parte de detalle, sólo recuperar aquellos elementos ÚNICOS, todos aquellos que la repetición de las etiquetas (en la misma etiqueta puede aparecer en un número de tema, ¡por supuesto!) son descartados por la consulta.

Una última cosa, el siguiente es el código que he usado en aspx para recuperar los datos, en caso de hacer el resultado tolist(), cambio (IQueryable < t>) a (IList):

<% foreach (var t in (IQueryable)ViewData["TopicList"])
       {
           var topic = (Topic)t;

    %>
    <li>
        <%=topic.title %> || 
        <% foreach (var tt in (topic.TagTopicMaps))
           { %>
                <%=tt.Tag.Name%>, 
                <%} %>
    </li>
    <%
        }
    %>
¿Fue útil?

Solución

La respuesta corta es: LinqToSql tiene varias peculiaridades de este tipo, ya veces hay que utilizar soluciones temporales ...

La opción Linq2Sql LoadWith simplemente provoca una unión interna entre las tablas de la base, por lo que puede forzar un comportamiento similar por Reescritura su estado de LINQ a algo así como (por favor, perdona ninguna errata, estoy acostumbrado a LINQ escribiendo en la sintaxis de VB ... ):

var x = from topic in db.Topics
        join topicMap in topic.TagTopicMaps
        orderby topic.dateAdded descending
        group topicMap by topicMap.topic into tags = Group;

Esta sintaxis puede ser muy mal, pero la idea básica es que se fuerza Linq2Sql para evaluar la unión entre los temas y TagTopicMaps, y luego utiliza la agrupación (o "unirse a grupo", "vamos", etc.) para preservar el objeto jerarquía en el conjunto de resultados.

Otros consejos

Ajuste el EnabledDefferedLoad en su clase DataContext a falso.

El problema en su caso se toma (10). Aquí es de la boca del caballo:

https://connect.microsoft.com/VisualStudio/feedback/details/473333/linq-to-sql-loadoptions-ignored-when-using-take-in-the-query

La solución sugerida es agregar Skip (0). Eso no funcionó para mí, pero el trabajo del salto (1) lo hizo. Inútil ya que puede ser, por lo menos sé que mi problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top