LEFT OUTER JOIN und Exists in Linq To SQL C # .NET 3.5
-
03-07-2019 - |
Frage
Ich bin fest auf einen linken Außen von LINQToSQL verbinden übersetzen, die einzigartig Mutter Zeilen zurückgibt.
Ich habe 2 Tabellen (Projekt, Project_Notes, und es ist eine 1-Beziehung von project_id verbunden ist). Ich mache eine Suche nach mehreren Spalten auf der 2-Tabelle, und ich möchte nur die einzigartigen Projekte zurück, wenn eine Spalte in Project_Notes ein Schlüsselwort enthält. Ich habe diese LinqToSql Sequenz gehen, aber es scheint, mehr Projekt Reihe zurückkehren werden. Vielleicht irgendwie in LINQ ein Exist
tun? Oder vielleicht ein groupby irgendeiner Art?
Hier ist der LINQToSQL:
query = from p in query
join n in notes on p.PROJECT_ID equals n.PROJECT_ID into projectnotes
from n in notes.DefaultIfEmpty()
where n.NOTES.Contains(cwForm.search1Form)
select p;
Hier ist die SQL aus Profiler erzeugt
exec sp_executesql N'SELECT [t2]. [Titel], [T2]. [Status], [T2]. [PROJECT_ID] [T2]. [PROVIDER_ID], [T2]. [CATEGORY_ID], [T2]. [City], [T2]. [UploadedDate] [T2]. [SubmittedDate], [T2]. [Project_type] FROM (SELECT ROW_NUMBER () OVER (ORDER BY [T0]. [UploadedDate]) AS [ROW_NUMBER], [t0]. [Titel], [t0]. [Status], [t0]. [PROJECT_ID] [T0]. [PROVIDER_ID], [t0]. [CATEGORY_ID], [t0]. [City], [t0]. [UploadedDate] [T0]. [SubmittedDate], [t0]. [Project_type] FROM [dbo]. [PROJEKTE] AS [t0] LEFT OUTER JOIN [DBO]. [PROJECT_NOTES] AS [t1] ON 1 = 1 WHERE ([T1]. [Anmerkungen] Wie @ p0) AND ([T0] .SubmittedDate]> = @ p1) und ([t0]. [SubmittedDate] <@ P2) und ([t0]. [PROVIDER_ID] = @ P3) und ([t0]. [CATEGORY_ID] IS NULL)) AS [t2] WHERE [t2]. [ROW_NUMBER] BETWEEN @ p4 + 1 @ AND p4 + p5 @ ORDER BY [t2]. [ROW_NUMBER] 'N' @ p0 VARCHAR (9), p1 @ DATETIME @ p2 DATETIME @ p3 int, int @ p4, p5 @ int‘, @ p0 = '% Chicago%', p1 @ = '' 2000.09.02 00: 00: 00: 000 '', @ p2 = '' 2009-03-02 00: 00: 00: 000 '', @ p3 = 1000, @ p4 = 373.620, @ p5 = 20
Diese Abfrage liefert alle mutiples der 1-viele-Beziehung in den Ergebnissen. Ich fand, wie man von hier eine Exists
in LINQ zu tun. http: / /www.linq-to-sql.com/linq-to-sql/t-sql-to-linq-upgrade/linq-exists/
Hier ist die LINQToSQL mit Exists
:
query = from p in query
where (from n in notes
where n.NOTES.Contains(cwForm.search1Form)
select n.PROJECT_ID).Contains(p.PROJECT_ID)
select p;
Die generierte SQL-Anweisung:
exec sp_executesql N'SELECT COUNT (*) AS [Wert] FROM [dbo]. [PROJEKTE] AS [t0] WHERE (EXISTS (SELECT NULL AS [LEER] FROM [dbo]. [PROJECT_NOTES] AS [t1] WHERE ([T1] .PROJECT_ID] = ([t0]. [PROJECT_ID])) und ([t1]. [NOTES] LIKE @ p0))) UND ([T0]. [SubmittedDate]> = @ p1) und ([t0]. [SubmittedDate] <@ P2) und ([t0]. [PROVIDER_ID] = @ P3) und ([t0]. [CATEGORY_ID] IS NULL) 'N' @ p0 varchar (9), @ p1 Datetime, @ p2 Datetime, @ p3 int‘, @ p0 = '% Chicago%', p1 @ = '' 2000.09.02 00: 00: 00: 000 '', @ p2 = '' 2009-03-02 00: 00: 00: 000 '', @ p3 = 1000
Ich erhalte ein SQL-Timeout von der databind()
von Exists
verwendet wird.
Lösung
scheint es mehr Projekt Reihe
zu zurückkehren
Ja, das ist, wie funktioniert beitreten. Wenn ein Projekt 5 passende Noten hat, es zeigt sich 5 mal.
Was passiert, wenn das Problem ist - "Join" ist das falsche Idiom
Sie möchten die Projekte, deren Noten enthalten bestimmte Text filtern:
var query = db.Project
.Where(p => p.Notes.Any(n => n.NoteField.Contains(searchString)));
Andere Tipps
Sie gehen zu müssen, die DefaultIfEmpty Erweiterung Methode verwenden. Es gibt ein paar Fragen auf SO bereits die zeigen, wie dies zu tun. Hier ist ein gutes Beispiel:
Wie kann ich ausführen ein Join, verschachtelt hinzufügen und Gruppe in LINQ?