2009-03-02 6 views
1

Ich bin fest auf der Übersetzung eines linken äußeren Joins von LINQToSQL, die eindeutige übergeordnete Zeilen zurückgibt.Left Outer Join und Existiert in Linq zu SQL C# .NET 3.5

Ich habe 2 Tabellen (Project, Project_Notes, und es ist eine 1-Viele Beziehung, die durch Project_ID verbunden ist). Ich mache eine Schlüsselwortsuche für mehrere Spalten in der Tabelle 2, und ich möchte nur die eindeutigen Projekte zurückgeben, wenn eine Spalte in Project_Notes ein Schlüsselwort enthält. Ich habe diese linqtoSQl Sequenz, aber es scheint mehrere Projektreihen zurückzugeben. Vielleicht eine Exist irgendwie in LINQ? Oder vielleicht eine Gruppe von irgendjemandem?

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]. [Stadt], [t2]. [UploadedDate], [t2]. [SubmittedDate], [ t2]. [Projekt_Typ] FROM (SELECT ROW_NUMBER() OVER (ORDER BY [t0]. [HochgeladenerDatum]) AS [ROW_NUMBER], [t0]. [Titel], [t0]. [Status], [t0]. [PROJECT_ID], [t0]. [PROVIDER_ID], [t0]. [CATEGORY_ID], [t0]. [Stadt], [t0]. [UploadedDate], [t0]. [SubmittedDate], [t0]. [Projekt_Typ] FROM [dbo]. [PROJEKTE] AS [t0] LINKS ÄUSSERETER JOIN [dbo]. [PROJEKT_NOTEN] AS [t1] ON 1 = 1 WHERE ([t1]. [ANMERKUNGEN] WIE @ p0) UND ([t0]. SubmittedDate]> = @ p1) UND ([t0]. [SubmittedDate] < @ p2) UND ([t0]. [PROVIDER_ID] = @ p3) UND ([t0]. [CATEGORY_ID] IST NULL)) AS [t2 ] WHERE [t2]. [ROW_NUMBER] ZWISCHEN @ p4 + 1 UND @ p4 + @ p5 ORDER BY [t2]. [ROW_NUMMER] ', N' @ p0 varchar (9), @ p1 datetime, @ p2 datetime, @ p3 int, @ p4 int, @ p5 int ', @ p0 ='% chicago% ', @ p1 =' '2000-09-02 00: 00: 00: 000' ', @ p2 =' '2009-03 -02 00: 00: 00: 000 '', @ p3 = 1000, @ p4 = 373620, @ p5 = 20

Diese Abfrage gibt alle Vielfachen der 1-Viele-Beziehung in den Ergebnissen zurück. Ich habe herausgefunden, wie man in LINQ von hier aus einen Exists macht. http://www.linq-to-sql.com/linq-to-sql/t-sql-to-linq-upgrade/linq-exists/

Hier wird 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 (EXISTEN (SELECT NULL WIE [LEER] VON [dbo]. [PROJECT_NOTES] AS [t1] WHERE ([t1] .PROJECT_ID] = ([t0]. [PROJECT_ID])) AND ([t1]. [NOTIZEN] WIE @ p0))) UND ([t0]. [SubmittedDate]> = @ p1) UND ([t0]. [Su bmittedDate] < @ p2) UND ([t0]. [PROVIDER_ID] = @ p3) UND ([t0]. [CATEGORY_ID] IST 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 ein SQL-Timeout von den databind() Suche von Exists verwenden.

+0

Es ist etwas unschön generierte SQL zu zeigen, die deutlich von Skip kam, Take, und Graf - und dann zeigen uns nicht überspringen Nimm und zähle. –

+0

wird alles vom Gridview-Steuerelement generiert. Da ich die Daten an sie gebunden habe, musste ich kein benutzerdefiniertes Paging durchführen. – stevenjmyu

Antwort

5

scheint es mehrere Projektreihe

Ja zu zurückkehren, das ist, wie funktioniert beitreten. Wenn ein Projekt 5 übereinstimmende Notizen enthält, wird es 5 Mal angezeigt.


Was ist, 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)));