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.

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top