2012-04-09 8 views
0

Gibt es eine Möglichkeit, die folgende Abfrage neu schreiben, um es nur eine Abfrage zu machen?Kombinieren von Unterabfragen in 1 Query Linq

try 
      { 
       var fileIds = (from f in context.SignalTo 
           where f.SignalFileID == 2 
           select new { f.GFileID }).ToList(); 



       foreach (var id in fileIds) 
       { 
        var pp = (from p in context.ProjectFiles 
            where p.FileID == id.GFileID && p.ProjectID == ProjectID 
            select p); 

        if (pp != null) 
        { 
         ProjectFiles projectFile =(ProjectFiles) pp; 
         projectFile.MStatus = Status; 
         projectFile.DateLastUpdated = DateTime.Now; 
         context.SaveChanges(); 
        } 


       } 
      } 
+0

Sie die 'wählen new' Syntax verwenden müssen - ich bin nicht vertraut genug mit der Syntax, obwohl eine Lösung zu schüren. – Alain

+0

Ich habe wählen Sie neu –

Antwort

1

Sie können die beiden Abfrage Teile des Codes in eine kombinieren.

Sie müssten dann die Ergebnismenge durchlaufen und Ihre Aktualisierungen vornehmen. Sie rufen dann context.SaveChanges auf, um alle Änderungen in einem Stapel zu senden.

kann ich nicht sagen, wenn Ihr tatsächlich vorhandenen Code ausgeführt oder kompiliert, aber Sie so etwas wie dieses brauchen:

die Liste der Datei-IDs Holen Sie sich interessieren:

var fileIds = from f in context.SignalTo 
       where f.SignalFileID == 2 
       select f.GFileID; 

fileIds ist an dieser Stelle ein IQueryable wo ich annahm, dass T ein Int ist. Es wurde noch keine Abfrage ausgeführt.

Jetzt können Sie

var pps = from p in context.ProjectFiles 
     where fileIds.Contains(p.FileID) && p.ProjectID == ProjectID 
     select p; 

tun Noch keine Abfrage ausgeführt.

iterieren dann über das Ergebnis gesetzt

foreach(var pp in pps) // query executed now 
{ 
    pp.MStatus = Status; 
    pp.DateLastUpdated = DateTime.Now; 
} 

context.SaveChanges(); // batch of updates executed now