如何存储Linq查询并在以后使用它?

时间:2017-09-16 09:41:19

标签: c# linq dynamic

我正在做一个wpf应用程序,我有一个问题,我想问你。

我正在查询窗口级别的数据库,并将查询结果传递给我的对象中的方法,如下所示:

窗口级代码:

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

ListOfSalary的类型object

现在这是我的问题,我有另一种方法,我希望通过listofsalary的每条记录来获取我在查询中选择的信息,例如MatriculeEmail,像这样的东西:

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

我无法引用Nom列或Email列的任何建议吗?

1 个答案:

答案 0 :(得分:6)

如果您考虑以下查询:

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)
    
  • 由于您希望存储查询,因此稍后您需要知道每个项目的类型。为此,请勿在select中使用匿名对象(new { })。使用自定义对象或使用名为tuples的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一样使用,只需访问属性,但您不会让intellisense显示属性和选项,因为它不知道具体类型