2016-04-28 13 views
0

Hier ist die SQL-Anweisung:In EF suche ich nach Duplikaten und mache eine selbstreferenzierende Abfrage, wie schreibe ich diese Abfrage?

SELECT f1.* 
FROM [File] f1 
where 1 < (select count(*) from [File] f2 where f1.FileName = f2.FileName) 
order by f1.FileName 

Dies ist eine ziemlich einfache Abfrage in SQL zu tun, aber ich bin nicht sicher, wie es in EF zu tun. Der nächstgelegene ich auf die Antwort gekommen ist diese (gibt mir die PK und zählen), aber ich möchte die vollständige Datei Datensatz zurück:

from f1 in File 
join f2 in File on f1.FileName equals f2.FileName  
group f1 by f1.FileId into c 
where c.Count() > 1 
select new { FileId = c.Key, number = c.Count() } 

Antwort

1

können Sie verwenden group join:

from f1 in File 
join f2 in File on f1.FileName equals f2.FileName into g  
where g.Count() > 1 
select f1 
+0

Danke! Das sieht nach der besten Passform aus. LinqPad sagt es übersetzt zu: - Region Parameter DECLARE @@ p0 Int = 1 - EndRegion SELECT [t0]. [FileId], [t0]. [Dateiname], [t0]. [DirectoryDefaultStructureId], [ t0]. [ProjektId], [t0]. [AssetId], [t0]. [BusinessUnitId], [t0]. [UploadedOn], [t0]. [ErstellerUserId] FROM [Datei] AS [t0] WHERE (( SELECT COUNT (*) FROM [Datei] AS [t1] WHERE [t0]. [Dateiname] = [t1]. [Dateiname] ))> @@ p0 –

0

ich in der Regel Verwenden Sie EF mit Lambda-Syntax, aber konnten Sie das Objekt nicht einfach projizieren?

from f1 in File 
join f2 in File on f1.FileName equals f2.FileName  
group f1 by f1.FileId into c 
where c.Count() > 1 
select c 
+0

Danke für die Antwort. Diese Syntax hat mein LinqPad tatsächlich zum Absturz gebracht, als ich es ausgeführt habe. Wenn ich mir das SQL ansehe, das es erzeugen würde, wäre es "interessant", um es zumindest zu sagen. Ivans Antwort oben scheint mehr von dem zu sein, wonach ich suche und der SQL sieht besser aus, aber ich danke Ihnen für Ihre Zeit. –

Verwandte Themen