Left Outer Join und Exists in Linq To SQL C# .NET 3.5

Bin ich fest auf die übersetzung von einem Links-outer-join aus LINQToSQL, gibt eindeutige übergeordnete Zeilen.

Ich habe 2 Tabellen (Projekt, Project_Notes, und es ist eine 1: N-Beziehung verknüpft Project_ID). Ich bin dabei eine keyword-Suche über mehrere Spalten der Tabelle 2 und ich nur zurückgeben willst einzigartige Projekte, wenn eine Spalte in Project_Notes enthält ein keyword. Ich habe diese linqtoSQl-Sequenz gehen, aber es scheint wieder mehrere Projekt-Zeilen. Vielleicht machen Sie eine Exist irgendwie in LINQ? Oder vielleicht ein groupby von einer Sorte?

Hier ist die 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, die es produziert von profiler

exec sp_executesql N ' select [t2].[Titel], [t2].[Staat], [t2].[PROJECT_ID],
[t2].[PROVIDER_ID], [t2].[CATEGORY_ID], [t2].[Stadt], [t2].[UploadedDate],
[t2].[SubmittedDate], [t2].[Project_Type]FROM ( SELECT ROW_NUMBER() OVER (ORDER BY
[t0].[UploadedDate]) AS [ROW_NUMBER], [t0].[Title], [t0].[Staat], [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 wenn ([t1].[ANMERKUNGEN] LIKE @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_NUMBER]',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 mutiples von der 1: N-Beziehung in den Ergebnissen. Ich fand, wie zu tun, ein Exists im LINQ-von hier aus. 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] WO
([t1].PROJECT_ID] = ([t0].[PROJECT_ID])) AND ([t1].[ANMERKUNGEN] LIKE @p0))) UND
([t0].[SubmittedDate] >= @p1) UND ([t0].[SubmittedDate] < @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

Bekomme ich einen SQL-timeout aus der databind() aus mit Exists.

Es ist etwas mürben, um zu zeigen, generiert SQL, die ganz klar Überspringen, Nehmen und Zählen - und dann nicht zeigen uns das Überspringen, Nehmen, und Zählen.
es ist alles erzeugt durch das Gridview-Steuerelement. Weil ich binden Sie die Daten zu, ich wollte nicht zu tun haben, benutzerdefinierte paging.

InformationsquelleAutor stevenjmyu | 2009-03-02

Schreibe einen Kommentar