Frage

Ich schreibe einen Tag-basierte ASP.net-System. Unter Verwendung der folgenden db Schema:

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

Im Grunde ist es ein 3NF Ansatz (toxi), die ich aus dem folgenden gefunden: http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html

Hier ist der Code-Schnipsel ich habe:

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);

Wenn ich dies auszuführen, ist das Ergebnis in Ordnung, aber es kommt mit 11 einzelnen SQL-Abfragen auf, einem für das Erhalten der Liste der Top-10-Themen:

    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 

Und 10 dieser anderen Einzelheiten der Tags einzeln zu bekommen.

Ich habe versucht, die beide Loadwith-Anweisungen ein- und auszuschalten, schalten und fanden die folgenden Dinge geschehen:

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

Kurz gesagt, nur die zweite Option Loadwith wie erwartet funktioniert. Die erste hat keine Wirkung!

Ich habe auch versucht die resultset ToList zu machen (). Aber noch mehr Problem herauskommt. Für die Tags Detail Teil, es nur die Unikaten abrufen, all diese Wiederholung Tags (! Am selben Tag in einer Reihe von Thema erscheinen könnte, natürlich) werden durch die Abfrage gelöscht

Eine letzte Sache, nach dem Code I in aspx verwendet, um die Daten abzurufen, im Fall das Ergebnis ToList machen (), die ich ändern (IQueryable) bis (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>
    <%
        }
    %>
War es hilfreich?

Lösung

Die kurze Antwort lautet: LinqToSql mehrere Macken wie diese hat, und manchmal muss man verwenden Umgehungen ...

Die Linq2Sql Loadwith-Option einfach bewirkt eine innere Verknüpfung zwischen den Datenbanktabellen, so können Sie ein ähnliches Verhalten erzwingen, indem rewritting Ihre Linq-Anweisung so etwas wie (verzeihen Sie bitte alle Fehler, bin ich writting Linq in VB-Syntax verwendet ... ):

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

Diese Syntax schrecklich falsch sein, aber die Grundidee ist, dass Sie Linq2Sql zwingen, die Verbindung zwischen Themen und TagTopicMaps zu bewerten und dann der Gruppierung (oder „Gruppe beitreten“, „lassen“, etc.), das Objekt zu erhalten Hierarchie in der Ergebnismenge.

Andere Tipps

Stellen Sie die EnabledDefferedLoad auf Ihrer Datacontext-Klasse falsch.

Das Problem in Ihrem Fall ist Nehmen Sie (10). Hier ist aus dem Maul des Pferdes:

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

Die vorgeschlagene Abhilfe ist, überspringen hinzufügen (0). Das hat bei mir nicht funktioniert, aber überspringt (1) funktioniert. Nutzlos, da es sein kann, zumindest ich weiß, wo mein Problem ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top