2016-07-21 23 views
0

Dies ist mein Code, der Informationen aus der Datenbank über eine Liste von Druckertreibern abruft. Die Tabelle enthält eine Liste der Druckertreiber sowie die Server, auf denen sie gefunden wurden.Verschachteln einer Liste <string> in einer benutzerdefinierten Klasse Liste über eine LINQ-SQL-Abfrage

public List<PrinterDrivers> GetPrinterDriversFromCache() 
     { 
      using (dbPrintSimpleDataContext db = new dbPrintSimpleDataContext()) 
      { 
       var q = from p in db.GetTable<tblPrinterDriverCache>() 
         where p.CacheGUID == mostRecentCacheID() 
         group p by p.PrinterDriver into g 
         select new PrinterDrivers 
         { 
          DriverName = g.Key, 
          InstalledOn = g.Where(x => x.PrinterDriver == g.Key).Select(x => x.PrinterServer).ToList(), 
          Usable = (g.Count() == Properties.Settings.Default.PrintServers.Count) 
         }; 
       return q.ToList(); 
      } 
     } 

Was ich zurück bin versucht, eine Liste, die eine Eigenschaft enthält, die eine Liste in sich hat, das enthält, was Server, die Druckertreiber existiert, ist. Ich denke, dass ich gegen die Grenze meiner aktuellen LINQ SQL-Kenntnisse :(

Die resultierende Liste enthalten:

Driver = Druckertreibernamen, in diesem Fall der Gruppenschlüssel (string)

InstalledOn = Liste (enthält die Liste der Server, auf denen dieser Druckertreiber gefunden wurde)

Verwendbar = Eine einfache Überprüfung, ob die Server, auf denen sie gefunden wurde, die gleiche Menge wie die Server in der Einstellungsdatei haben.

Danke für die Hilfe :)

+0

Können Sie genau das Problem ausarbeiten, vor dem Sie stehen? –

+0

InstalledOn enthält falsche Ergebnisse, dh keine Ergebnisse, die ich erwartet habe. Ich erwartete, dass jeder gruppierte DriverName eine Liste der Druckserver enthielt, auf denen er installiert war. Die Tabelle in dieser Abfrage enthält eine Liste von Druckertreibern und Druckservern. Daher sollte die Abfrage nur den angegebenen Druckertreiber zusammen mit einer Liste der gefundenen Server zurückgeben. Ist das sinnvoll? Ich bin ein bisschen neblig, weil ich den ganzen Tag programmiert habe –

Antwort

0

Try this:

LINQ Lambda, Group by with list

Das Problem ist, dass Linq nicht über ToList nicht kennt. Nur ein Teil der gesamten Abfrage auf dem Server ausgeführt wird, da es ein zusätzlicher ToList Anruf vor dem letzten ToList Anruf (Ungeprüfte Code unten)

public List<PrinterDrivers> GetPrinterDriversFromCache() 
    { 
     using (dbPrintSimpleDataContext db = new dbPrintSimpleDataContext()) 
     { 
      var q = (from p in db.GetTable<tblPrinterDriverCache>() 
        where p.CacheGUID == mostRecentCacheID() 
        group p by p.PrinterDriver.DriverName into g 
        select g 
        ).ToList().Select(g => new PrinterDrivers 
        { 
         DriverName = g.Key, 
         InstalledOn = g.Where(x => x.PrinterDriver == g.Key).Select(x => x.PrinterServer).ToList(), 
         Usable = (g.Count() == Properties.Settings.Default.PrintServers.Count) 
        }); 
      return q.ToList(); 
     } 
    } 

Translating das gleiche Muster aus der Antwort ist verknüpfen ich, würden Sie sein:

var q = db.GetTable<tblPrinterDriverCache>() 
      .Where(p => p.CacheGUID == mostRecentCacheID()) 
      .Select(o => new { DriverName = o.DriverName, PrintServer = o.PrintServer }) 
      .GroupBy(g => g.DriverName) 
      .ToList() 
      .Select(g => new PrinterDrivers 
       { 
        DriverName = g.Key, 
        InstalledOn = g.Select(p => p.PrinterServer).ToList(), 
        Usable = (g.Count() == Properties.Settings.Default.PrintServers.Count) 
       } 
      ) 
      .ToList(); 
+0

Das lässt mich fühlen, dass ich vielleicht in die falsche Richtung gehe. Vielleicht gibt es einen besseren Weg, um diese Informationen zu erhalten, und dann versuchen, alles in der einen Abfrage passieren zu lassen. –

+0

Eigentlich, wenn Sie zuerst filtern (Sie sind), dann die Daten zurückgeben, ist es nicht so schlimm. Ich kann mir keinen besseren Weg vorstellen, und das sollte in Ordnung sein. Jeder andere Weg (kurz von etwas, an das ich nicht denke) wird noch mehr (N ​​+ 1) Anfragen haben. –

+0

Ja, okay. Dieser Code führte dazu, dass dasselbe passiert (ich musste "select g" hinter der Zeile "group p by p.PrinterDriver ing" hinzufügen, damit die Abfrage funktionieren würde). Ich könnte die DB nach doppelten Daten oder so etwas überprüfen. –

Verwandte Themen