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 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das ist wie die join funktioniert. Wenn ein Projekt 5 passenden Noten, es zeigen sich 5-mal.
Was ist, wenn das problem ist, "Mitmachen" ist die falsche Redewendung!
Dem Sie filtern möchten die Projekte, für diejenigen, deren Noten enthalten, die bestimmten text:
InformationsquelleAutor Amy B
Sind Sie gehen zu müssen, verwenden die DefaultIfEmpty-Erweiterung-Methode. Es gibt ein paar Fragen auf ALSO bereits, die zeigen, wie dies zu tun. Hier ist ein gutes Beispiel:
Wie kann ich eine verschachtelte Join, Hinzufügen und Gruppieren in LINQ?
InformationsquelleAutor casperOne