2017-09-16 86 views
2

我正在做一個wpf應用程序,並且我想問你一些問題。如何存儲Linq查詢並稍後使用它?

我查詢窗口級數據庫和我查詢的結果傳遞給方法在我的對象是這樣的:

窗口級代碼:

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 }); 

這是我的方法定義:

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

哪裏ListOfSalaryobject型。

現在這裏是這個問題對我來說,我有我想要走線槽的listofsalary每個記錄,並得到我在查詢中選擇喜歡MatriculeEmail,像這樣的信息的另一種方法:

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

我無法參考Nom列或Email列的任何建議?

+0

你是什麼意思的「我不能引用」 - 如果你嘗試會發生什麼?你正在使用動態類型,所以你不應該期望Intellisense *建議*任何東西,但如果你只是使用它*可能*的性能。但是,每次您調用'SendEmail'時,您都會執行查詢。爲了避免這種情況,你可能想*實現查詢,例如通過在它的結尾調用'ToList()'(你可以調用'SetListOfSalariesToEmail')。目前還不清楚*爲什麼*你正在動態地做所有這些。爲什麼不使用具有所需信息的合適類型? –

+0

我會使用SQL DataAdapter並將結果放入數據表中。然後,您可以將數據表傳遞給代碼的其餘部分,而不是在這種情況下使用linq。 – jdweng

回答

5

如果你認爲你的下面的查詢:

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 
      }; 

運行該行的查詢還沒有執行到數據庫之後。只有當你實現它時(使用像ToList()/ToArray()/FirstOrDefault等函數)它實際上是在數據庫中執行並返回信息。

因此,如果您只是做SomeFunction(query);它不會執行查詢,您可以將其存儲以供日後執行。

然而,你需要改變你的代碼位:

  • 的功能不應該得到的對象,但IQueryable<T>

    public void SetListOfSalariesToEmailTo(IQueryable<T> query) 
    
  • 當你想保存查詢您稍後需要知道每個項目的類型。爲此,請勿在選擇中使用匿名對象(new { })。而不是使用自定義對象或者使用C#7.0命名元組,然後功能將類似於:

    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; 
    } 
    

您仍然可以使用objectdynamic像你一樣,只是訪問屬性,但您不會有智能感知向您顯示屬性和選項,因爲它不知道具體類型。

+0

@ Soufiane.Ach - 這篇幫你解決這個問題? –

相關問題