LINQ zu SQL-Paging

9

Ich habe die Erweiterungsmethoden .Skip () und .Take () seit einiger Zeit mit LINQ To SQL ohne Probleme verwendet, aber in allen Situationen, in denen ich sie benutzt habe, war es immer für eine einzige Tabelle - wie:

%Vor%

Mein Problem ist, dass ich jetzt eine Reihe von Ergebnissen aus mehreren Tabellen projiziere, und ich möchte auf die Gesamtmenge pagen (und immer noch den Vorteil des Blätterns in der DB bekommen).

Mein Entitätsmodell sieht so aus:

Eine Kampagne [hat viele] Gruppen, eine Gruppe [hat viele] Kontakte

Dies wird durch eine Beziehung in der Datenbank wie

modelliert

Kampagne - & gt; CampaignToGroupMapping - & gt; Gruppe - & gt; GroupToContactMapping - & gt; Kontakt

Ich muss eine Datenstruktur generieren, die die Details einer Kampagne enthält, sowie eine Liste aller Kontakte, die über CampaignToGroupMapping mit der Kampagne verknüpft sind, d. h.

%Vor%

Ich hatte versucht, eine LINQ-Abfrage mit .SelectMany zu schreiben, um die Menge der Kontakte aus jeder Gruppe in einen linearen Datensatz zu projizieren, in der Hoffnung, ich könnte .Skip () .Take () daraus machen.

Mein Versuch war:

%Vor%

Das Problem ist, dass das Paging (in Bezug auf Skip () und Take ()) für jede Gruppe geschieht, nicht für den gesamten Datensatz.

Das heißt, wenn ich den Wert 200 für den Parameter totalRequired (übergeben an .Take ()) verwende und drei Gruppen mit dieser Kampagne verbunden sind, werden 200 aus jeder Gruppe benötigt - nicht 200 aus den Gesamtdaten jeder der Kampagne zugeordneten Gruppe.

In SQL konnte ich dies mit einer Abfrage erreichen wie:

%Vor%

Mit dieser Abfrage blättere ich den kombinierten Satz von Kontakten aus jeder Gruppe, die der bestimmten Kampagne zugeordnet ist. Also meine Frage ist, wie kann ich dies mit LINQ To SQL-Syntax stattdessen erreichen?

    
Martin 23.04.2009, 12:52
quelle

3 Antworten

4

Um die von Ihnen angegebene SQL-Abfrage nachzuahmen, würden Sie Folgendes tun:

%Vor%

Versuchen Sie, über Kampagnen, Empfänger oder beides zu blättern?

    
Jimmie R. Houts 23.04.2009 16:23
quelle
0

Verwenden Sie eine Ansicht, um die Ergebnisse aus den mehreren Tabellen zu aggregieren, und verwenden Sie dann LINQ über die Ansicht

    
rguerreiro 23.04.2009 12:55
quelle
0

Ich denke, dein Versuch ist sehr nahe; Vielleicht verpasse ich etwas, aber ich denke, du musst deine SelectMany () vor dem Skip / Take schließen:

%Vor%

Hinweis: hinzugefügt ")" nach "/ * Kontaktdaten * /})" und entfernt ")" von nach ".Take (totalRequired)"

    
Chris Shaffer 23.04.2009 19:23
quelle

Tags und Links