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.
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. –
wird alles vom Gridview-Steuerelement generiert. Da ich die Daten an sie gebunden habe, musste ich kein benutzerdefiniertes Paging durchführen. – stevenjmyu