2017-09-16 36 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 - 这篇帮你解决这个问题? –

相关问题