2017-09-16 3 views
2

Ich mache eine WPF-App und ich habe ein kleines Problem, über das ich dich gerne fragen würde.Wie speichert man eine Linq-Abfrage und verwendet sie später?

ich eine Datenbank auf dem Fenster Ebene abfragen und i passieren das Ergebnis der Abfrage auf ein Verfahren in meinem Objekt wie folgt:

Fenster Level-Code:

payrollEmailManager.SetListOfSalariesToEmailTo(
    from Record in SqlInfo.SqlTable.T_SALs 
    where Record.EtatPaie == 3 
    select new { 
     Matricule = Record.MatriculeSalarie, 
     Nom = Record.Nom, 
     Prenom = Record.Prenom, 
     Email = Record.EMail }); 

Das ist meine Methode Definition:

public void SetListOfSalariesToEmailTo(object _ListOfSalaryToRecieveMail) 
{ 
    ListOfSalary = _ListOfSalaryToRecieveMail; 
} 

Wo ListOfSalary auch von object Typ ist.

Jetzt ist hier die Frage für mich, habe ich eine andere Methode, wo ich hin will jeden Datensatz von listofsalary Trog und die Informationen, die ich in Abfrage wie folgt wie Matricule oder Email, etwas ausgewählt bekommen:

public void SendEmail() 
{ 
    foreach(var Salary in (dynamic)ListOfSalary) 
    { 
     Mail.To.Add(Salary.???? 
    } 
} 

Ich kann nicht auf die Nom Spalte oder die Email Spalte einen Hinweis verweisen ??

+0

Was meinen Sie mit "Ich kann nicht verweisen" - was passiert, wenn Sie es versuchen? Sie verwenden dynamisches Schreiben, also sollten Sie nicht erwarten, dass Intellisense irgendetwas vorschlägt, aber wenn Sie nur die Eigenschaften verwenden, die * funktionieren * können. Sie werden die Abfrage jedoch jedes Mal ausführen, wenn Sie 'SendEmail' aufrufen. Um dies zu vermeiden, möchten Sie vielleicht die Anfrage * materialisieren *, z. durch Aufruf von 'ToList()' an dessen Ende (wenn Sie 'SetListOfSalariesToEmail' aufrufen). Es ist nicht klar * warum * du tust das alles dynamisch. Warum nicht einen geeigneten Typ verwenden, der alle benötigten Informationen enthält? –

+0

Ich würde einen SQL DataAdapter verwenden und Ergebnisse in eine Datentabelle einfügen. Dann können Sie die Datentabelle an den Rest Ihres Codes übergeben, anstatt linq in diesem Fall zu verwenden. – jdweng

Antwort

5

Wenn Sie folgende Abfrage betrachten:

var query = from Record in SqlInfo.SqlTable.T_SALs 
      where Record.EtatPaie == 3 
      select new { 
       Matricule = Record.MatriculeSalarie, 
       Nom = Record.Nom, 
       Prenom = Record.Prenom, 
       Email = Record.EMail 
      }; 

Nach dem Ausführen dieser Zeile der Abfrage noch nicht in der Datenbank ausgeführt wird. Nur wenn Sie es materialisieren (mit Funktionen wie ToList()/ToArray()/ etc.) wird es tatsächlich in der Datenbank ausgeführt und Informationen werden zurückgegeben.

Daher, wenn Sie nur SomeFunction(query); tun es führt die Abfrage nicht aus und Sie können es für die spätere Ausführung speichern.

Allerdings brauchen Sie Ihren Code ein wenig zu ändern: get

  • Die Funktion sollte nicht Objekt, sondern IQueryable<T>

    public void SetListOfSalariesToEmailTo(IQueryable<T> query) 
    
  • Wie Sie die Abfrage speichern wollen, müssen Sie später auf kenne den Typ jedes Gegenstandes. Verwenden Sie dazu kein anonymes Objekt (new { }) in der Auswahl. Verwenden Sie stattdessen ein benutzerdefiniertes Objekt oder verwenden C# 7.0 genannt Tupeln und dann wird die Funktion wie folgt aussehen:

    var query = from Record in SqlInfo.SqlTable.T_SALs 
          where Record.EtatPaie == 3 
          select new SomeType { 
           Matricule = Record.MatriculeSalarie, 
           Nom = Record.Nom, 
           Prenom = Record.Prenom, 
           Email = Record.EMail 
          }; 
    
    public void SetListOfSalariesToEmailTo(IQueryable<SomeType> query) 
    { 
        ListOfSalary = query; 
    } 
    

Sie noch object und dynamic verwenden können, wie Sie getan haben, und Zugriff nur die Eigenschaften, aber Sie werden nicht das Intellisense haben, das Ihnen die Eigenschaften und Optionen zeigt, da es den konkreten Typ nicht kennt.

+0

@ Soufiane.Ach - Hat Ihnen das geholfen, das Problem zu lösen? –

Verwandte Themen