Wie die Rückkehr Abfrage-Ergebnisse aus der Methode, die verwendet LINQ to SQL
Hier ist der code mit dem ich arbeite, ich bin noch ein bisschen neu für LINQ, das ist also ein work in progress. Speziell möchte ich, um meine Ergebnisse aus der Abfrage (über 7 Spalten von strings, int, datetime), und gibt Sie an die Methode, die die Methode aufgerufen hat, mit diesem LINQ to SQL-Abfrage. Ein einfaches Codebeispiel wäre super hilfreich.
using (ormDataContext context = new ormDataContext(connStr))
{
var electionInfo = from t1 in context.elections
join t2 in context.election_status
on t1.statusID equals t2.statusID
select new { t1, t2 };
}
(In diesem Fall meine Abfrage gibt alle Inhalte von 2 Tabellen, Wahl und election_status.)
InformationsquelleAutor alchemical | 2009-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hi, das problem hast du mit deiner Abfrage ist, dass Sie bei der Erstellung eines anonymen Typs. Sie kann nicht zurückkehren, ein anonymer Typ von einer Methode, so ist dieses, wo Sie gehen zu müssen, Schwierigkeiten.
Was Sie tun müssen, ist, erstellen Sie eine "wrapper" - Typ, können Sie eine Wahl und eine election_status und dann wieder diese.
Hier ein kleines Beispiel von was ich Rede; wie Sie sehen können, erkläre ich für eine Tuple-Klasse. Die Methode, die Sie wickeln Ihre Anfrage liefert ein IEnumerable.
Ich hoffe, das hilft 🙂
UPDATE
Folgenden von NagaMensch Kommentare, einen besseren Weg, um das gewünschte Ergebnis erzielen, wäre die Nutzung der eingebauten LINQ to SQL-Verbände.
Wenn Sie gehen, um Ihre entity-Diagramm und klicken Sie auf toolbox, sehen Sie 3 Optionen. Klasse, Assoziation und Vererbung. Wir wollen Verein.
Klicken Sie auf Vereinigung und klicken Sie auf die ElectionStatus Person, halten Sie die Maustaste gedrückt, und es wird Ihnen erlauben, ziehen Sie eine Linie, um die Wahl Einheit.
Einmal haben Sie die Linie gezogen, es wird Sie Fragen, welche Eigenschaften beteiligt sind, in den Verein. Sie wollen wählen Sie die StatusId Spalte von der Wahl Entität, und die StatusId Spalte aus der ElectionStatus Einheit.
Nun, dass Sie Sie abgeschlossen haben Ihre mapping werden Sie in der Lage, vereinfachen Sie Ihre Abfrage sehr, weil der join wird nicht nötig sein. Sie können einfach Zugriff auf die election-status über eine Marke neue Eigenschaft, die von LINQ to SQL wird Hinzugefügt, um die Wahl Einheit.
Kann Ihr code nun so Aussehen:
Finden Sie auch ein "how to" auf LINQ to SQL-Verbände hier.
Hinweis: Es ist erwähnenswert, dass, wenn Sie haben eine FK-Beziehung zwischen den Tabellen in der Datenbank, LINQ to SQL wird automatisch auszuwählen, die Beziehung und Zuordnung der Verein für Sie (also die Schaffung der Eigenschaften).
Neue, LINQ und verwendet die gleiche Methode ein paar mal.
wird das beibehalten der Integrität der sql-join?
In der Tat, Sie sind richtig. Es wäre eine schreckliche Idee zu implementieren Klassen in diesem Stil jedes mal, wenn Sie wollen, um Ergebnisse aus einer Abfrage. In LINQ to SQL können Sie sagen, die designer, dass es eine Beziehung zwischen den beiden Entitäten, und es ermöglicht Ihnen den Zugriff auf die zugehörige Entität mit einer Eigenschaft. So können Sie wieder eine Wahl und dann Zugriff auf den status von anrufen Wahl.election_status. Dies wäre ein viel besserer Weg, dies zu tun und würde auch die Aufrechterhaltung der Integrität der Verknüpfung.
Ich habe aktualisiert die Antwort zu erklären, wie man Verbände zu implementieren, die eine viel bessere Lösung. Wenn Sie nicht weiterkommen oder die weiterer Erläuterung bedürfen, lasst es mich einfach wissen 🙂 ich hoffe, das hilft.
InformationsquelleAutor Doctor Jones
Müssen Sie Klassen erstellen, die die gleiche Struktur wie die anonymen Typen. Dann, anstelle von "new { t1, t2 }", "new MyClass(t1, t2)".
Sobald Sie einen benannten Klasse, man kann Sie alle über dem Platz, wie Sie gehofft hatten.
InformationsquelleAutor John Fisher
Das problem ist, dass Sie erstellen einen anonymen Typ, daher gibt es keine Möglichkeit, zu erklären, eine Methode, die mit diesem Typ zurückgegeben. Sie haben, um eine neue Art, halten Sie Ihre Abfrage-Ergebnis und return-Typ.
Aber ich schlage nicht zurück, das Ergebnis in einer neuen Art aber wieder nur eine colection von
election
Objekte und den Zugriff auf dieelection_status
Objekte durch den Bezug von Eigenschaften vorausgesetzt, Sie enthalten Sie in Ihrem Modell. Das laden der Daten-Optionen führen Sie die Abfrage, die im Zusammenhang election status der Objekte in der Ergebnismenge der Abfrage.Nun können Sie das folgende tun.
I Allgemeine LINQ to SQL konnte nur das abrufen der verbundenen Körperschaften auf der Nachfrage - als deferred loading.
Aber das braucht Sie nicht zu schließen Sie den Daten-Kontext, bis Sie fertig mit der abgerufenen Objekte, daher kann nicht verwendet werden, die mit einem
using
- Anweisung gekapselt in einer Methode.Gutes timing - nur Hinzugefügt, deferred loading 23 Sekunden, nachdem Sie Ihren Kommentar. ^^
Bemerkte ich 🙂 ich hatte auch nicht realisiert, die Sie nutzen könnten LoadWith auf den Zusammenhang - konnte ich sehen, dass kommt in handliches. Danke!
InformationsquelleAutor Daniel Brückner
InformationsquelleAutor Harshal
vielleicht hilft es 🙂
Sie können wählen Sie alles, was u wollen in select new {...}, nur weiß den Namen der Spalte und der Tabelle 🙂
InformationsquelleAutor Firma Agnes
Wie definieren Sie die Liste der aufrufenden Methode? Ich habe versucht, und lief in Probleme mit der Liste brauchen einen Typ, wir haben aber nur ein anonymer Typ(?)
Es muss eine Liste oder so etwas, weil die Daten Kontext entfernen entsorgt, daher Rücksendung IQueryable oder IEnumerable und auswerten der Abfrage später zu einer Ausnahme führen durch den Zugriff auf eines verworfenen Objekt.
aber eine Liste, welche Art?
InformationsquelleAutor Daniel A. White
Können Sie nicht zurück eine anonyme Art von Methode. Es ist nur in dem Gültigkeitsbereich, in dem es erstellt wird. Sie müssen zum erstellen einer Klasse statt.
Dies scheint eine sehr mühsame Art und Weise zu behandeln, die für alle db-Aufruf...
ja das ist was ich meine, die Art von Informationen ist verschwunden. Es sei denn, Sie verwenden Reflexion.
es ist nicht, dass große Sache. Sie brauchen nur eine Klasse, mit was auch immer Eigenschaften, die Sie anonym sind geben Sie wieder ... die automatischen Eigenschaften machen Sie es sich ziemlich schnell.
Glaubst du wirklich, dass ein Objekt erstellen, für jede einzelne db-Aufruf ist einfach? Ein großes Projekt konnte problemlos Hunderte von db-Aufrufe...dann, wenn die db ändert sich der code ist spröde und braucht massive mühsame änderungen.
InformationsquelleAutor Richard Hein